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 的文件。
- 在 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')
这次的行为略有不同 - 更好 - 但不完全正确。
- Chrome on Windows: 一段时间后下载完成,但 zip 是 corrupted/damaged,我无法打开里面的文件 (PDF)。
- Chrome 在 MacOS 上:没问题。下载有效,可以打开文件。
所以基本上,我试图确定这些问题是否可以通过 Flask 得到改善(例如,与下载相关的配置选项),或者我是否应该探索 nginx/gunicorn.
中的选项
我最终只使用 Nginx 直接提供 .zip 文件,下载问题也已解决。
我尝试的 python 解决方案中的 None 解决了这个问题,而且我在网上阅读的大部分内容表明 python/Flask 是提供文件的次优解决方案。
在我的应用的 sites-available
文件中,我做了一个简单的 location {}
来实现这个:
location /download/url {
alias /path/to/static/directory;
}
我有一个使用 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')
这次的行为略有不同 - 更好 - 但不完全正确。
- Chrome on Windows: 一段时间后下载完成,但 zip 是 corrupted/damaged,我无法打开里面的文件 (PDF)。
- Chrome 在 MacOS 上:没问题。下载有效,可以打开文件。
所以基本上,我试图确定这些问题是否可以通过 Flask 得到改善(例如,与下载相关的配置选项),或者我是否应该探索 nginx/gunicorn.
中的选项我最终只使用 Nginx 直接提供 .zip 文件,下载问题也已解决。
我尝试的 python 解决方案中的None 解决了这个问题,而且我在网上阅读的大部分内容表明 python/Flask 是提供文件的次优解决方案。
在我的应用的 sites-available
文件中,我做了一个简单的 location {}
来实现这个:
location /download/url {
alias /path/to/static/directory;
}