Skip to main content
 首页 » 编程设计

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

2024年12月31日21lori

我在子路径 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 , 可能有点关系