【问题标题】:How do I serve a generated file in Django via nginx as download?如何通过 nginx 在 Django 中提供生成的文件作为下载?
【发布时间】:2021-02-25 03:28:48
【问题描述】:

我正在尝试通过 nginx 在我的媒体文件夹中提供生成的 zip 文件,但出现以下错误:open() "/etc/nginx/htmltest.zip" failed (2: No such file or directory)

不知何故,nginx 在一个奇怪的格式错误的“/etc/nginx/html”中寻找文件,我不明白为什么。

我正在通过 docker-compose 使用 nginx,如果我不使用 nginx 并且只在开发模式下运行 Django,代码就可以正常工作。

folder_path = os.path.join(settings.MEDIA_ROOT, str(uuid.uuid4()))
os.mkdir(folder_path)

shutil.make_archive(os.path.join(folder_path, "test"), 'zip', folder_path, "test")

response = download(os.path.join(folder_path, f"{zip_name}.zip"))


def download(path):
    if os.path.exists(path):

        with open(path, 'rb') as f:
            response = HttpResponse(f.read(), content_type="application/zip")
            response['Content-Disposition'] = 'inline;filename=' + os.path.basename(path)
            response['X-Accel-Redirect'] = os.path.basename(path)
            return response

    raise Http404

我的 nginx.conf:

upstream django_app {
    server web:8000;
}

server {

    listen 80;

    location / {
        proxy_pass http://django_app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        client_max_body_size 100M;
    }

    location /static/ {
        alias /code/static/;
    }

    location /media/ {
        alias /code/media/;
    }

}

settings.py 中的 MEDIA_ROOT:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

【问题讨论】:

    标签: python django nginx


    【解决方案1】:

    您错误地使用了nginx X-Accel-Redirect

    当使用X-Accel-Redirect 时,您不需要自己从Django 读取和发送文件,nginx 会为您完成。这就是X-Accel-Redirect 的重点:卸载从应用服务器发送的文件到 nginx(这更好)。

    所以删除X-Accel-Redirect 标头,然后Django 将直接提供文件。

    如果您想使用X-Accel-Redirect,那么您需要按照文档中的说明设置 nginx(您的配置不完整,因为它缺少 internal 位置),然后提供内部 URLX-Accel-Redirect 标头中(您错误地提供了文件系统路径)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 2019-07-21
      • 2012-04-13
      • 2020-06-17
      • 1970-01-01
      • 2015-03-18
      • 2013-03-25
      相关资源
      最近更新 更多