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

时间:2015-01-26 10:00:04

标签: django nginx django-rest-framework gunicorn

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

目前,起始页面按预期在https://100.100.100.100/exampleproject呈现。但是,“产品”的资源路径不起作用。 <{3}}起始页面显示https://100.100.100.100/exampleproject/products - 而不是https://100.100.100.100/products,而不是https://100.100.100.100/exampleproject/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;
    }

当我手动访问{{3}}时,Nginx会在/var/log/nginx/access.log中记录以下内容:

  

“GET / products / HTTP / 1.1”404 151“ - ”

2 个答案:

答案 0 :(得分:9)

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

FORCE_SCRIPT_NAME = '/exampleproject'

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

答案 1 :(得分:1)

只需从代理服务器通过网址中删除尾部斜杠,如下所示:

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。