【问题标题】:How to host a Django project in a subpath?如何在子路径中托管 Django 项目?
【发布时间】:2015-03-24 17:39:39
【问题描述】:

我正在使用 Django REST framework 构建一个 API,它通过 Gunicorn 和 Nginx 提供服务。项目“exampleproject”必须在子路径中运行,例如:https://100.100.100.100/exampleproject(示例 IP 地址)。我没有为该 IP 注册的域名。

目前,起始页在https://100.100.100.100/exampleproject 处按预期呈现。但是,“产品”的资源路径不起作用。起始页显示 https://100.100.100.100/products 而不是 https://100.100.100.100/exampleproject/products - 这不起作用。

我在/etc/nginx/sites-enabled/default中配置了exampleproject的子路径如下:

server {

    # ...

    location /exampleproject/ {
        proxy_pass        http://localhost:8007/;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  Host $host;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
    }

当我手动访问https://100.100.100.100/exampleproject/products时,Nginx在/var/log/nginx/access.log中记录如下:

"GET /products/ HTTP/1.1" 404 151 "-"

【问题讨论】:

    标签: django nginx django-rest-framework gunicorn


    【解决方案1】:

    我发现here 需要在settings.py 中将以下设置添加到Django 的配置中:

    FORCE_SCRIPT_NAME = '/exampleproject'
    

    这似乎重写了嵌套资源的所有路径。

    【讨论】:

    • 文档可以找到here
    【解决方案2】:

    只需从代理传递 URL 中删除尾部斜杠,如下所示:

    proxy_pass http://localhost:8007;
    

    如果指定 proxy_pass 时未指定 URI,则请求 URI 以与处理原始请求时客户端发送的相同格式传递给服务器,然后保留 /exampleproject/ 部分。

    见:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

    然后您需要配置 Django 以理解 /exampleproject/ 下的 URL。

    首先,您可以通过像这样更新urls.py 文件来为所有 URL 添加子路径:

    urlpatterns = [url(r'^exampleproject/', include(urlpatterns))]
    

    而且,如果您提供静态和媒体服务,只需在设置中更新:

    MEDIA_URL = '/exampleproject/media/'
    STATIC_URL = '/exampleproject/static/'
    

    当然,您可以创建自定义设置来复制此设置或使应用程序在没有子路径的情况下也可以运行,我相信这是比FORCE_SCRIPT_NAME 更好的解决方案,因为在这种情况下,我发现我们需要更新 Django URL无论如何。

    【讨论】:

      猜你喜欢
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2021-02-17
      相关资源
      最近更新 更多