Skip to main content
 首页 » 编程设计

python之使用 Gunicorn、Nginx 和 Django 的 URL 解析错误

2024年08月26日31lvdongjie

我只有在使用 Gunicorn 时才会出现奇怪的错误:

我有一个设置 Nginx + 一个具有以下配置的 django 项目:

location / { 
  proxy_pass       http://127.0.0.1:8080; 
  proxy_set_header X-Real-IP $remote_addr; 
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  proxy_set_header Host $http_host; 
  proxy_set_header SCRIPT_NAME /; 
} 

当我使用 django 开发服务器 (1.7.5) 时:

./manage.py runserver 127.0.0.1:8080 

一切正常。

但是当我运行的时候

gunicorn -b :8080 --forwarded-allow-ips="*" --proxy-allow-from="*" app.wsgi 

我只收到 404 错误(django 正在接收请求,因为我有调试消息)。

这些错误很奇怪,因为未设置变量 urlpatterns ( https://github.com/django/django/blob/1.7.5/django/views/debug.py#L1102 )。我只获得了 原因 变量 ( https://github.com/django/django/blob/1.7.5/django/views/debug.py#L1119 ) 设置为:

{u'path': u'x/'} 

按照我的要求http://domain.something.com/x/

最麻烦的是django自带的基本服务器工作正常... :(

请您参考如下方法:

删除

   proxy_set_header SCRIPT_NAME /; 

来自 nginx 配置的将完成这项工作。这就是 django 处理 SCRIPT_NAME header 的方式:当存在时,django 会在解析它时从 URL 的前面删除该值,并在反转它时将它添加回 url 的前面。这样你就可以告诉 django 所有的 url 都应该是相对于某个目录的,而不用触及你项目中的任何东西。 SCRIPT_NAME 应设置为不带尾随/因此您域的根目录的正确值为空字符串(或完全没有 SCRIPT_NAME)。