Django - 在子路径中运行时静态文件的问题

2024-01-24

我有 django 应用程序在子路径中运行example.com/api/。大部分是rest API(我使用django-rest-framework),所有请求都正常工作。但是静态文件到处都有错误的路径 - 在管理面板和请求页面中(在 django-rest-framework 中,你有前端来调查事情)。 Django 以某种方式认为,所有静态文件都在example.com/back/static/,当他们在example.com/api/back/static/.

Also example.com/api/admin重定向到example.com/admin/login/,但是手动转到之后example.com/api/admin/login/一切都很顺利(但仍然没有样式)。

我的堆栈是在 docker 容器中运行的 nginx + Django 2.0.5。

Nginx 配置:

location /api/ {
    proxy_pass            http://localhost:8000/;
    proxy_read_timeout    90;
    proxy_connect_timeout 90;
    proxy_set_header      Host $host;
    proxy_set_header      X-Real-IP $remote_addr;
    proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header      Proxy "";
}

当谈到姜戈时STATIC_URL被设定为os.path.join(BASE_DIR, "static/"), FORCE_SCRIPT_NAME未设置,但设置后根本不起作用。

有任何想法吗?

[Update]

经过几个小时的战斗,我放弃了。问题与 uwsgi 无法识别它在子路径中运行有关。以下是一些对于遇到类似问题的人可能有用的链接:

通过 nginx+uwsgi 在子路径中运行 django 应用程序 https://stackoverflow.com/questions/11292217/run-django-app-via-nginxuwsgi-in-a-subpath

在子路径上运行 Django https://integricho.github.io/2014/02/22/running-django-on-a-subpath/

使用 Nginx 和 Gunicorn 为多个 Django 应用程序提供服务 http://michal.karzynski.pl/blog/2013/10/29/serving-multiple-django-applications-with-nginx-gunicorn-supervisor/

Django WSGI 路由 http://spazzy757.com/wsgi-routing/

我放弃了,只是为这个项目创建了单独的子域。


这是一个已知的issue https://code.djangoproject.com/ticket/25598在姜戈.

预期行为

外部世界(nginx\uwsgi\whatever)应该有SCRIPT_NAME标头(等于/api在你的情况下)并将其转发给 Django。

Django 应该尊重这个标头并将其添加到生成的 URL 中{%url ... %}标记(它已经这样做了)并且用于生成的静态文件链接{% static ... %}(这不起作用,请参阅提到的问题)。

要解决此问题,您可以直接将前缀附加到STATIC_URL: STATIC_URL = '/api/static'...但我同意这是一个肮脏的黑客行为。正确的方法是将其固定在 Django 端。

另请参阅https://stackoverflow.com/a/57009760/1657819 https://stackoverflow.com/a/57009760/1657819,可能有点相关

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django - 在子路径中运行时静态文件的问题 的相关文章