Django,Nginx对urls.py的奇怪行为

时间:2018-03-30 18:40:00

标签: python django docker nginx django-rest-framework

使用Django和django-rest-framework进行开发和API。

我有一个运行Ubuntu的linux服务器,安装了Docker和Nginx,我在Docker容器中运行带有Postgresql数据库的Django App。服务器的nginx暴露端口443并通过unix socket将其隧道传输到docker。

一切似乎都没问题。但项目级urls.py中的部分让我疯狂过了五个小时。

我的应用级别urls.py

from django.conf.urls import url
from devices.viewsets import *
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'endpoint1', Endpoint1ViewSet, base_name='user')
router.register(r'users', UsersViewSet, base_name='device')
urlpatterns = router.urls

项目级urls.py

from django.contrib import admin
from django.conf.urls import url
from django.urls import include, path
from rest_framework.documentation import include_docs_urls

API_PREFIX = 'api/v1/'

urlpatterns = [
    url(API_PREFIX + 'docs/', include_docs_urls(title='API Docs')),
    url(API_PREFIX + 'admin/', admin.site.urls),
    url(API_PREFIX, include('devices.urls')) # This line is killing me
]

Nginx部分:

  # API
    location /api/v1 {
        include uwsgi_params;
        uwsgi_pass unix:/var/run/api/app.sock;
    }

    location /api/v1/static {
        rewrite /api/v1/static/(.*) /$1 break;
        root /home/ubuntu/device_api/api/v1/static;

    }

到目前为止,我使用docker-compose启动容器,我可以访问https://myweb.com/api/v1/docshttps://myweb.com/api/v1/admin

但API端点本身似乎隐藏在某处,因为当我尝试请求https://myweb.com/api/v1/users时,我得到nginx 502并且在docker-compose logs | grep api中给出了这个输出:

 django.db.utils.ProgrammingError: relation "api_user" does not exist
api          | LINE 1: ..., "api_user"."note", "api_user"."company_id" FROM "api_user"

这似乎是试图访问/users/api/v1?这很奇怪,因为API的根https://myweb.com/api/v1/为我提供了所有可访问端点的默认django-rest-framework页面,但是,它们不起作用。

HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "users": "https://myweb.com/api/v1/users/",
    "devices": "https://myweb.com/api/v1/devices/",   
}

我已经尝试了很多东西,我真的没有想法,感谢任何帮助,谢谢。

编辑: 对于那些想知道的人,将url更改为path也无效。

EDIT2:添加了项目结构

device_api
├── device_api
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── device_api.service
├── devices
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── models.py
│   ├── serializers.py
│   ├── tests.py
│   ├── urls.py
│   ├── viewsets.py
│   └── views.py
├── docker-compose.yml
├── Dockerfile
├── manage.py
├── requirements.txt
└── uwsgi.ini

EDIT3: 当我更改项目级别urls.py时,如下所示:

urlpatterns = [
    url(API_PREFIX + 'docs/', include_docs_urls(title='API Docs')),
    url(API_PREFIX + 'admin/', admin.site.urls),
    path(API_PREFIX, include('devices.urls')) # This line is killing me
]

https://myweb.com/api/v1/users的请求输出导致Django 404具有以下可能的路径:

api/v1/docs/
api/v1/admin/
api/v1/ ^users/$ [name='user-list']
api/v1/ ^users\.(?P<format>[a-z0-9]+)/?$ [name='user-list']
api/v1/ ^users/(?P<pk>[^/.]+)/$ [name='user-detail']
api/v1/ ^users/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='user-detail']
api/v1/ ^devices/$ [name='device-list']
api/v1/ ^devices\.(?P<format>[a-z0-9]+)/?$ [name='device-list']
api/v1/ ^devices/(?P<pk>[^/.]+)/$ [name='device-detail']
api/v1/ ^devices/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='device-detail']

1 个答案:

答案 0 :(得分:0)

我找到了。

为什么它给我遗留表api.user的db错误的原因是因为apps.py中的一行

from django.apps import AppConfig

class MyConfig(AppConfig):
    name = 'devices'
    verbose_name = 'API Data'
    label = 'api'

那个标签变量导致Django认为我的应用程序被称为api而不是devices,所以当我manage.py migrate时,它没有创建表,即使我列出了设备INSTALLED_APPS

也许我在开发中添加了标签并且没有太多关注它,因为,好吧..它被称为标签,谁知道它可以做什么影响.. 使用devices而不是api重命名标签并执行manage.py migrate devices后,一切都开始有效。