IT干货网

Django + uWSGI + nginx url 映射

zhenyulu 2024年11月24日 编程设计 37 0

我想在 NGINX 后面用 uWSGI 运行 Django。

我将使用 Django 作为 API 服务,它应该存在于这个链接上:
项目.test/api
Django项目本身是空白的(1.9.6),只是创建了一个应用程序,迁移并创建了一个 super 用户。

我的项目结构如下所示:
/vagrant/api/here-lives-whole-django
/vagrant/api/uwsgi_params
/vagrant/frontend/some-frontend-work-seperated-from-django

我的 NGINX 设置如下所示:

upstream testing { 
    server 127.0.0.1:8000; 
} 
 
server { 
    listen   80; 
 
    server_name www.testing.test; 
 
    charset  utf-8; 
 
    client_max_body_size  75M; 
 
    access_log  /var/log/nginx/www.testing.test.access.log; 
    error_log  /var/log/nginx/www.testing.test.error.log; 
 
    location /api/ { 
        include /vagrant/api/uwsgi_params; 
        uwsgi_pass testing; 
    } 
 
    location / { 
        root /vagrant/frontend; 
    } 
} 

uwsgi_params 文件:
uwsgi_param  QUERY_STRING       $query_string; 
uwsgi_param  REQUEST_METHOD     $request_method; 
uwsgi_param  CONTENT_TYPE       $content_type; 
uwsgi_param  CONTENT_LENGTH     $content_length; 
 
uwsgi_param  REQUEST_URI        $request_uri; 
uwsgi_param  PATH_INFO          $document_uri; 
uwsgi_param  DOCUMENT_ROOT      $document_root; 
uwsgi_param  SERVER_PROTOCOL    $server_protocol; 
uwsgi_param  REQUEST_SCHEME     $scheme; 
uwsgi_param  HTTPS              $https if_not_empty; 
 
uwsgi_param  REMOTE_ADDR        $remote_addr; 
uwsgi_param  REMOTE_PORT        $remote_port; 
uwsgi_param  SERVER_PORT        $server_port; 
uwsgi_param  SERVER_NAME        $server_name; 

我的 Django 网址模式:
urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
] 

自动取款机。我使用以下命令运行 Django:
uwsgi --socket :8000 --wsgi-file wsgi.py

我可以访问 Django,但是当我尝试访问时
www.testing.test/api/admin
我得到一个 404(来自 Django 的调试)。
Page not found (404) 
Request Method: GET 
Request URL:    http://www.testing.test/api/admin 
Using the URLconf defined in testing.urls, Django tried these URL patterns, in this order: 
^admin/ 
The current URL, api/admin, didn't match any of these. 

我知道对于习惯了这些东西的人来说这将是一件非常简单的事情,请原谅我,因为我是新手。

附言。我在人们一起工作的地方发现了一些类似的问题
uwsgi_param SCRIPT_NAME /api; 
uwsgi_modifier1 30;  

但这只是让我的 Django 告诉我一个 404
Request URL:    http://www.testing.test/api/api/admin 

当我要求
Request URL:    http://www.testing.test/api/admin 

请您参考如下方法:

我很难理解你的问题,但基本上它恢复到这个:我想要 nginx将所有调用传递给 /api/到 django 但 django 正在接收带有 /api/ 的 URL前缀。

nginx 技巧(不适用于内部 URL)

我会使用 nginx的重写来解决这个问题

location /api/ { 
    rewrite ^/api/(.*) /$1  break; 
    include /vagrant/api/uwsgi_params; 
    uwsgi_pass testing; 
} 

它将删除 /api/ URL 的一部分并保留在 uwsgi_pass 的 block 中进入 Django 。

django 解决方案(我认为很脏)

以上适用于进入 django 的第一个 URL。然而,django 对被删除的前缀一无所知,并且很难为自己生成 URL。这在一些简单的 API 中可能不是问题,但它往往会成为问题。

我想,唯一可行的方法是将前缀添加到基本 URLconf。
from django.conf.urls import include 
 
mypatterns = [ 
    url(r'^admin/', admin.site.urls), 
] 
 
urlpatterns = [ 
    url(r'^api/', include(mypatterns)), 
] 

虽然,我觉得这是一个 很脏解决方案。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!