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

问题描述 投票:7回答:2

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

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

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

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
2个回答
10
投票

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

FORCE_SCRIPT_NAME = '/exampleproject'

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


0
投票

只需从代理服务器传递URL中删除结尾的斜杠,如果指定proxy_pass时不带URI,则将请求URI以与原始请求处理时客户端发送的格式相同的形式传递给服务器,然后保持[C0 ]部分。

参见:/exampleproject/

然后,您需要配置Django以了解http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass下的URL。

首先,您可以像这样通过更新/exampleproject/文件在所有URL前面添加子路径:

urls.py

而且,如果要提供静态信息和媒体,只需在设置中进行更新:

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

当然,您可以创建一个自定义设置来复制此文件或使应用程序也没有子路径,我相信这是比MEDIA_URL = '/exampleproject/media/' STATIC_URL = '/exampleproject/static/' 更好的解决方案,因为在这种情况下,我发现我们仍然需要更新Django URL 。

© www.soinside.com 2019 - 2024. All rights reserved.