【发布时间】:2018-12-12 16:40:36
【问题描述】:
我在子路径 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
我放弃了,只是为这个项目创建了单独的子域。
【问题讨论】:
-
您希望 django 应用提供自己的静态文件还是希望 nginx 提供服务(更好)?
-
@schwobaseggl 我想用 django 提供自己的静态文件
-
您的
STATIC_URL设置看起来像是您希望它成为您的STATIC_ROOT设置。然后将STATIC_URL设置为/api/back/static/。确保在服务器上调用collectstatic。还将您的LOGIN_URL设置为/api/admin/login/ -
它不起作用,似乎 django 在此请求中省略了 'api' 子路径。
-
您必须在站点的settings.py中声明STATIC_ROOT和STATIC_URL。