Django uWSGI nginx url映射

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

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

我的项目结构如下所示:
/流浪者/ API /这里 – 生命 – 全的Django
/流浪/ API / uwsgi_params
/流浪者/前端/部分 – 前端工作分隔的,从-的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 /管理
我得到一个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.

我知道对于习惯这种东西的人来说这将是非常简单的事情,请原谅我,因为我很新.

PS.我找到了一些与人合作的类似问题

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 / prefixed的URL.

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

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

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

它将删除URL的/ api /部分并保留在uwsgi_pass的块中以进入Django.

django解决方案(在我看来很脏)

以上工作原理为第一个进入django的URL.然而,django对于删除的前缀毫无头绪,并且无法为自己生成URL.在一些简单的API中,这可能不是问题,但它往往是一个问题.

我想,唯一可行的方法是在基本URLconf中添加前缀.

from django.conf.urls import include

mypatterns = [
    url(r'^admin/',]

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

虽然,我觉得这是一个非常肮脏的解决方案.

相关文章

文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、N...
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的...
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时...
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+...
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以...
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx ...