如何在子路径中托管 Django 项目?

Posted

技术标签:

【中文标题】如何在子路径中托管 Django 项目?【英文标题】:How to host a Django project in a subpath? 【发布时间】: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 "-"

【问题讨论】:

【参考方案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无论如何。

【讨论】:

以上是关于如何在子路径中托管 Django 项目?的主要内容,如果未能解决你的问题,请参考以下文章

在子路径中通过 nginx+uwsgi 运行 django app

在子路径下托管 Pyramid webapps

PyCharm 使用Github托管Django项目

如何在vs studio中使用代码云托管

一个 Django 项目的多域托管

无法在子路径上托管 Storybook