Непоследовательная .zip загрузка из приложения Flask через nginx / gunicorn - PullRequest
0 голосов
/ 05 ноября 2019

У меня установлено приложение Flask с Nginx и Gunicorn. Приложение имеет конечную точку, которая позволяет пользователям загружать указанный ZIP-файл. Многие из zip-файлов небольшие, но у меня есть один большой - около 2,4 ГБ - который демонстрирует непоследовательное поведение при загрузке. У меня не было проблем с загрузкой файлов меньшего размера (размером не более 500 МБ);проблемы возникают только при размере файла более 2 ГБ.

Мой первоначальный код:

@app.route('/zip')
def zip_download(name):

    file_name = '{}.zip'.format(name)
    
    zip_file = os.path.join(app.config['ZIP_PATH'], file_name)

    if os.path.exists(zip_file):
        return send_file(
                zip_file,
                as_attachment=True,
                attachment_filename=file_name)
    else:
         # tell user file doesn't exist

С этой конечной точкой мне не удалось загрузить весь файл 2,4 ГБ.

  • Использование Chrome в Windows: загрузка может составить ~ 1 ГБ, а затем перезапустить загрузку полностью. Этот цикл, казалось бы, повторяется в цикле.
  • Использование Chrome в MacOS: такое же поведение.

Я немного изменил код, чтобы использовать вместо него метод send_from_directory:

@app.route('/zip')
def zip_download(name):

    file_name = '{}.zip'.format(name)
    
    zip_file = os.path.join(app.config['ZIP_PATH'], file_name)

    if os.path.exists(zip_file):
        return send_from_directory(app.config['ZIP_PATH'],
                                   file_name,
                                   as_attachment=True,
                                   mimetype='application/zip')

На этот раз поведение немного отличается - лучше - но не совсем правильно.

  • Chrome в Windows: загрузка завершена через некоторое время, но zip-файл поврежден / поврежден, и я не могу открыть файлы (PDF-файлы) внутри.
  • Chrome на MacOS: нет проблем. Загрузка работала и могла открывать файлы.

По сути, я пытаюсь определить, можно ли улучшить эти проблемы с помощью Flask (например, параметры конфигурации, относящиеся к загрузке) или мне следует изучить параметры в nginx / gunicorn.

1 Ответ

0 голосов
/ 13 ноября 2019

В итоге я просто использовал Nginx для непосредственного обслуживания файлов .zip, и проблемы с загрузкой были решены.

Ни одно из решений python, которые я пытался решить, не решило проблему, и большая часть того, что я прочитал в Интернете, указала, что python / Flask был неоптимальным решением для обслуживания файлов.

В моем sites-available файле для моего приложения я сделал простой location {} для достижения этой цели:

location /download/url {
    alias /path/to/static/directory;
}
...