使用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/docs
,https://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']
答案 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
后,一切都开始有效。