【问题标题】:Django - problems with static files when running in subpathDjango - 在子路径中运行时出现静态文件的问题
【发布时间】: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

Running Django on a subpath

Serving multiple Django applications with Nginx and Gunicorn

Django WSGI routing

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

【问题讨论】:

  • 您希望 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。

标签: python django nginx


【解决方案1】:

如果你 proxy_pass Nginx 中的一个位置并将一个 URI 添加到你的 proxy_pass 指令中,你是在告诉 Nginx 从原始请求 URL 中删除它,并将请求 URI 的那部分替换为你的 proxy_pass URI。所以这个:

location /api/ {
    proxy_pass            http://localhost:8000/;

告诉 Nginx 对 example.com/api/path/to/whatever/ 的请求应该代理到 http://localhost:8000/path/to/whatever/

如果您希望将原始未更改的请求 URI 传递给代理,请从 proxy_pass 指令的末尾删除 /

【讨论】:

    【解决方案2】:

    这是 Django 中已知的issue

    预期行为

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

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

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

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

    【讨论】:

      【解决方案3】:

      将此代码添加到您的 nginx 配置中:

      location /static/ {
          alias /path/static/;
      }
      

      您应该定义静态文件的位置,以便读取它。

      【讨论】:

        猜你喜欢
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多