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

标签 python django nginx

我在子路径 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

Running Django on a subpath

Serving multiple Django applications with Nginx and Gunicorn

Django WSGI routing

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

最佳答案

这是一个已知的 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/

相关文章:

Python:根据条件对字典中的值求和

python - 打包一个django项目及其依赖为standalone "product"

python - Django:获取按组分隔的模板的所有权限

ssl - 始终选择 Nginx 默认服务器 - 多个 SSL 服务器

python - 多列表理解转化为单列表理解

python - verse() 在调用时抛出 AttributeError

python - Apache mod_wsgi 使用的 python 版本与 python-path 和 WSGIPythonHome 中提到的版本不同

reactjs - 如何在Prod中使用Docker和Nginx运行React?

nginx + vueJS + 静态登陆页面

python - 将 WTForms 字段标签与字符串进行比较总是返回 False