Django REST Framework:如何在 URL 中添加前缀以进行版本控制

Posted

技术标签:

【中文标题】Django REST Framework:如何在 URL 中添加前缀以进行版本控制【英文标题】:Django REST Framework: How to add prefix in URL for versioning 【发布时间】:2015-01-01 16:18:16 【问题描述】:

我正在尝试为 REST 应用程序创建版本。这是我的网址示例

www.myapi.com/foo [default version]
www.myapi.com/v1/foo [version one]

这是项目结构

├── __init__.py
├── settings.py
├── urls.py
├── default_app
│ ├── __init__.py
│ ├── serializer.py
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ 
└── v1_app
├── __init__.py
├── serializer.py
├── models.py
├── views.py
├── urls.py

default_app urls.py

from django.conf.urls import *
from default_app import views as df_views
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'foo', df_views.viewname, "foo")
urlpatterns = router.urls

v1_app urls.py

from django.conf.urls import *
from v1_app import views as ver_views
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'foo', ver_views.viewname, "foo")
urlpatterns = router.urls

urls.py 的主文件

from django.conf.urls import patterns, include, url
from defualt_app import urls as default_urls
from v1_app import urls as v1_urls
from django.contrib.staticfiles.urls import staticfiles_urlpatterns



urlpatterns += patterns('',
    url(r'^', include(default_urls, namespace="default")),
    url(r'^v1/', include(v1_urls, namespace="v1"))
)

urlpatterns += staticfiles_urlpatterns()

我的问题是,当我使用没有任何前缀的简单 url 时,它正在工作

www.myapi.com/foo

当我使用版本前缀 v1 或 v2 时,它会抛出错误 [Page not found (404)]

www.myapi.com/v1/foo

我从这个链接得到了这个想法 https://***.com/a/21839842/1558544

如果我不使用中间件类,那么这可能得到相同的结果吗?

谢谢

【问题讨论】:

如果将更明确的 '^v1' 模式放在 '^' 前面会发生什么 那么两者都不起作用。找不到页面(404)错误 【参考方案1】:

Django REST Framework 不能很好地支持 url 命名空间,但有一些解决方案可以让它们在大多数情况下工作。

对于序列化程序,您必须定义所有与HyperlinkedRelatedField 超链接的字段,包括自动添加的url 字段,即HyperlinkedIdentityField。这包括将所有字段上的view_name 参数设置为正确的、自动生成的视图名称。这应该类似于[namespace]:[base_name]-detail

但这也意味着您不能使用DefaultRouter 生成的DefaultRouter 索引页面,因为它根本不处理命名空间。为了获得一个,您将需要创建自己的视图,或者覆盖路由器中自动生成的视图。

【讨论】:

以上是关于Django REST Framework:如何在 URL 中添加前缀以进行版本控制的主要内容,如果未能解决你的问题,请参考以下文章

Django.rest_framework:如何序列化一对多?

如何使用 TemplateHTMLRenderer 在 Django-REST-Framework 中创建/放置?

django-rest-framework:如何序列化已经包含 JSON 的字段?

如何在 Django Rest Framework 中散列 Django 用户密码?

如何仅使用 django 作为后端并使用 django-rest-framework 发布

如何在 React 中显示来自 django-rest-framework 的错误消息