flaskを用いて集めたデータをxlsxでダウンロードしたいがタイムアウトしてしまう。


flaskを使ってアンケートを取り、それをテンプレートのxlsxを読み込んで出力するサイトを構築しました。  
しかし、オフラインではうまくいったのですがオンライン上ではInternal Server Errorになってしまいます。  
おそらく処理がタイムアウトしてしまっているのだと思います。  
処理を軽くする方法や、代替案などがありましたら教えていただきたいです。  
データはsqliteのデータを読み込んで使っています。  
プログラミングを勉強し始めたばかりなので根本的な指摘などもあれば頂きたいです。

使用しているライブラリ : sqlite3, openpyxl, io.bytesio, flask.make_response  
使用しているPaaS : Azure(無料枠)

[code]

    output = io.BytesIO()
    
    wb = openpyxl.load_workbook('data/template.xlsx')
    worksheet = wb.get_sheet_by_name('sheet1')
    for x,data in enumerate(datas):
        worksheet.cell(row=3+x, column=2).value = int(get_user_transport(data)
        worksheet.cell(row=3+x, column=3).value = int(get_user_payment(data)
        worksheet.cell(row=3+x, column=4).value = data["user_name"]
        for i,day in enumerate(day_list):
            if data[day] == "0":
                pass
            else:
                worksheet.cell(row=3+x, column=5+(i*3)).value = int(data[day].split("-")[0])
                worksheet.cell(row=3+x, column=6+(i*3)).value = int(data[day].split("-")[1])
    
    wb.save(output)
    
    output.seek(0)
    
    response = make_response()
    response.data = output.read()
    response.headers['Content-Disposition'] = 'attachment; filename=' + file_name
    response.mimetype = XLSX_MIMETYPE
    
    output.close()
    return response
    
[/code]




Internal Server Error ということは、HTTP Status
Codeは500だと思います。原因がタイムアウトでない可能性があり、その場合、タイムアウトしないように対策しても問題が解決しません。例えば、データ量が多すぎてメモリが足りないとかの可能性もあるので、エラーの原因はしっかり調べた方がよさそうです。Flaskの実行ログを記録し、エラーが起きたらログを確認してみてください。

もし原因がタイムアウトだとなった場合、ブラウザにレスポンスを返すまでの時間を短くする必要があります。そのために非同期処理を実装して対策する方法があります。非同期処理のためにPythonでよく使われるのはCeleryというライブラリです。詳しくは
<http://www.celeryproject.org/> に情報がありますが、日本語でblog等の記事を書いている人もいると思います。

