我在子路径 example.com/api/
中运行了 Django 应用程序.大部分是 rest API(我使用 django-rest-framework),所有请求都正常工作。但是静态文件到处都有错误的路径 - 在管理面板和请求页面中(在 django-rest-framework 中你有前端来调查事情)。 Django 以某种方式认为,所有静态文件都在 example.com/back/static/
中, 当他们在 example.com/api/back/static/
.
还有 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 "";
}
谈到 Django STATIC_URL
设置为 os.path.join(BASE_DIR, "static/")
, FORCE_SCRIPT_NAME
未设置,但设置后,它根本不起作用。
有什么想法吗?
[更新]
经过几个小时的斗争,我放弃了。问题与 uwsgi 没有识别出它在子路径中运行有关。以下是一些对有类似问题的人有用的链接:
Run django app via nginx+uwsgi in a subpath
Serving multiple Django applications with Nginx and Gunicorn
我放弃了,只是为这个项目创建了单独的子域。
最佳答案
这是一个已知的 issue在 Django 中。
预期行为
外部世界 (nginx\uwsgi\whatever) 应该有 SCRIPT_NAME
header (在你的情况下等于 /api
)并将它转发给 Django。
Django 应该尊重这个 header 并将其添加到使用 {%url ... %}
标记生成的 URL(它已经这样做了)和使用 {% 生成的静态文件链接static ... %}
(这不起作用,请参阅提到的问题)。
要解决此问题,您可以将前缀直接附加到 STATIC_URL
:STATIC_URL = '/api/static'
...但我同意这是一个肮脏的 hack。正确的方法是将其固定在 Django 端。
另见 https://stackoverflow.com/a/57009760/1657819 , 可能有点关系
关于python - Django - 在子路径中运行时静态文件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51170280/