【问题标题】:Django assigns incorrect media URL [duplicate]Django分配了不正确的媒体URL [重复]
【发布时间】:2019-12-26 20:59:00
【问题描述】:

[已解决] 这是重复的。答案在this question

(端口未包含在 django 在生产设置中生成的资源 url 中,nginx .conf 中的更改修复了它。我在特定端口上本地测试生产设置。显然,如果默认端口这不会有问题用于生产。)


我正在(本地)为我的 Django 项目创建一个(Dockerized)生产设置。我将 Django 与 Gunicorn 和 NGINX 一起使用。 NGINX 处理静态和媒体文件,(工作正常,因为我可以通过手动输入正确的 URL 来访问它们)。虽然 Django 确实正确链接到静态文件,但媒体文件的 URL 是错误的。

对于媒体文件,它会跳过 URL 中的端口,而对于静态文件则不会。我试图删除尾随/ 并设置MEDIA_URL = 'localhost:1337/media/'。我不明白为什么静态 URL 正确而媒体 URL 不正确,因为我以完全相同的方式设置它们:

settings.py:

DEBUG = False

STATIC_URL = '/static/'
STATIC_ROOT = 'path/to/static'

MEDIA_URL = '/media/'
MEDIA_ROOT = 'path/to/media'
  • (正确)Django 链接到静态文件的示例:http://localhost:1337/static/path/to/file
  • 上传媒体文件的 Django 链接示例:http://localhost/media/path/to/file
  • 媒体文件的实际位置:http://localhost:1337/media/path/to/file

根据要求,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;
    }

    location /static/ {
        alias /path/to/static/;
    }

    location /media/ {
        alias /path/to/media/;
    }

}

【问题讨论】:

  • 有点困惑。您是说希望端口 1337 在 URL 中吗?看起来您已将 nginx 配置为直接提供静态文件,所以我假设您需要端口 80。
  • 抱歉不清楚。 Nginx 在 docker 容器中运行。容器端口 80 映射到端口 1337。因此 localhost:1337 是您到达该站点的位置。问题是 django 跳过了指向媒体的 url 链接中的 1337,而它确实适用于静态文件。即:localhost/media/path/to/file 而不是localhost:1337/media/path/to/file

标签: python django nginx


【解决方案1】:

问题在于您的 nginx/docker 配置,而不是您的 django 应用程序。

你能分享你的 nginx 配置文件吗?

将服务添加到 docker-compose.prod.yml:

nginx:
  build: ./nginx
  ports:
    - 1337:80
  depends_on:
    - web

此外,如果您使用完整的 url,请将您的 STATIC_URL 和 MEDIA_URL 设置为相对 url,并将您的 STATIC_ROOT 和 MEDIA_ROOT 更改为 os.path.join(BASE_DIR, 'static'/'media') 而不是指定完整的或手动相对路径。

【讨论】:

  • 将服务添加到 docker-compose.prod.yml: nginx: build: ./nginx ports: - 1337:80 depends_on: - web
  • 感谢您的回答。 nginx 服务已经在我的 docker-compose.prod.yml 中。就像我在问题中提到的那样,我可以通过输入正确的媒体 url 自己访问媒体文件。但是,django 分配用于获取媒体文件的 url 不正确。我尝试设置 MEDIA_ROOT 和 STATIC_ROOT 的相对路径,但这会导致同样的问题。
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 2016-05-19
  • 2020-04-17
  • 1970-01-01
  • 2021-03-02
  • 2018-01-16
相关资源
最近更新 更多