【问题标题】:Inconsistent .zip download from Flask app over nginx/gunicorn通过 nginx/gunicorn 从 Flask 应用程序下载不一致的 .zip
【发布时间】:2019-11-13 06:55:54
【问题描述】:

我有一个使用 Nginx 和 Gunicorn 部署的 Flask 应用程序。该应用程序有一个端点,可让用户下载指定的 zip 文件。许多 zip 文件都很小,但我有一个大的 - 大约 2.4GB - 显示出不一致的下载行为。我下载较小的文件(不大于 500MB)没有问题;这些问题似乎只出现在 2GB+ 文件大小附近。

我的初始代码是:

@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.4GB 文件。

  • 在 Windows 上使用 Chrome:下载将达到 ~1GB,然后完全重新启动下载。这个循环似乎会循环重复。
  • 在 MacOS 上使用 Chrome:同样的行为。

我继续稍微编辑代码以改用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')

这一次的行为略有不同 - 更好 - 但并不完全正确。

  • Windows 上的 Chrome:下载在一段时间后完成,但 zip 已损坏/损坏,我无法打开其中的文件 (PDF)。
  • MacOS 上的 Chrome:没问题。下载工作,可以打开文件。

所以本质上,我正在尝试确定这些问题是否可以通过 Flask(例如,与下载相关的配置选项)得到改善,或者我是否应该探索 nginx/gunicorn 中的选项。

【问题讨论】:

    标签: python nginx flask zip gunicorn


    【解决方案1】:

    我最终只使用 Nginx 直接提供 .zip 文件,并且下载问题得到了解决。

    我尝试的所有 python 解决方案都没有解决这个问题,我在网上阅读的大部分内容都表明 python/Flask 是提供文件的次优解决方案。

    在我的应用程序的sites-available 文件中,我制作了一个简单的location {} 来实现此目的:

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

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2021-07-22
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2019-10-18
      • 2018-10-09
      • 2023-03-31
      相关资源
      最近更新 更多