nginx/gunicorn 从 Flask 应用程序下载不一致的 .zip

Inconsistent .zip download from Flask app over nginx/gunicorn

我有一个使用 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 的文件。

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

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

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

中的选项

我最终只使用 Nginx 直接提供 .zip 文件,下载问题也已解决。

我尝试的 python 解决方案中的

None 解决了这个问题,而且我在网上阅读的大部分内容表明 python/Flask 是提供文件的次优解决方案。

在我的应用的 sites-available 文件中,我做了一个简单的 location {} 来实现这个:

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