

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]


CC BY-SA 4.0
2018-06-21T04:06:57.117
44939
2018-06-21T23:49:22.870
29024
question
python excel flask
flaskを用いて集めたデータをxlsxでダウンロードしたいがタイムアウトしてしまう。


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

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


CC BY-SA 4.0
2018-06-21T04:51:34.503
44941
2018-06-21T04:51:34.503
806
44939
answer


Pythonの`for`を使った繰り返し処理は遅いので、Pandas,
Numpyを入れてできるだけNumpyで処理をさせるようにすると処理は早くなります。ただし、メモリーを多く消費するので無料枠のサーバーではメモリが足りなくなる可能性が高くなります。

Excelのファイルをオンラインで作成するというのは結構重い処理なので、根本的にレスポンスを早くしようと思えば、次の手段が考えられます。

  1. サーバー側の処理では、csv又はjsonのファイルを作成するだけにして、ブラウザー側で`Sheet.js`を使ってExcelのファイルを作成する。

  2. オンラインでExcelファイルを作成せずに、事前に出力用のExcelのファイルを作成しておいてそれを出力する。例えば、1時間おきに作成するようにすれば、直近のデータは入っていないが実際はそれで困らないケースが多いです。また、直近データがどうしても必要というのであればそれだけをオンラインで作るようにします。


CC BY-SA 4.0
2018-06-21T16:08:46.767
44970
2018-06-21T23:49:22.870
2018-06-21T23:49:22.870
15171
15171
44939
answer