我遇到了一个关于将 API 应用程序分开的问题,同时仍然能够使用可浏览的 API 进行导航。
我以前用过单独的 routers.py
我的主应用程序中的文件包含 DefaultRouter
的以下扩展名.
class DefaultRouter(routers.DefaultRouter):
def extend(self, router):
self.registry.extend(router.registry)
然后像这样添加其他应用程序路由器:
from . routers import DefaultRouter
from app1.urls import router as app1_router
# Default Router
mainAppRouter = DefaultRouter()
mainAppRouter.extend(app1_router)
哪里
app1_router
是新的SimpleRouter
目的。现在当我想修改
SimpleRouter
时出现问题并创建我自己的 App1Router
,比如这个class App1Router(SimpleRouter):
routes = [
Route(
url = r'^{prefix}{trailing_slash}$',
mapping = {
'get': 'retrieve',
'post': 'create',
'patch': 'partial_update',
},
name = '{basename}-user',
initkwargs = {}
),
]
这将无法正确处理我的扩展。例如,
GET
和 PATCH
每当我扩展路由器时都不会被识别为允许的方法,但是当我不扩展而只使用自定义路由器时,一切正常。因此,我的问题是,如何处理跨单独应用程序扩展自定义路由器,但仍保持良好的可浏览 API?
最佳答案
路由器注册只是一个标准的python列表,所以你可以直接在注册上调用YourRouter.registry.extend()而不需要对DefaultRouter进行子类化,查看DRF的来源here .
由于registry是一个列表,当你扩展registry时,你会在python列表的顶部添加另一个python列表,这意味着调用YourRouter.registry.extend(app_router.registry)。
对我有用的是从另一个应用程序(SimpleRouters)导入路由器并将它们添加到默认路由器注册表之上。
#aplication_root/urls.py
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from app_3.urls import router as app_3_router
router = DefaultRouter()
router.registry.extend(app_3_router.registry)
urlpatterns = [
path('api/', include(router.urls)),
]
如果您尝试通过添加前缀向您的应用程序添加版本控制,我建议您查看 DRF 中可用的版本控制架构 - 也许它可以满足您的需求
DRF versioning
例如在您的设置中启用 URLPathVersioning
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning'
}
上面截取的 urlparttern 列表看起来像这样
urlpatterns = [
path('api/<version>/', include(router.urls)),
]
关于django - 在 Django Rest Framework 中跨应用程序将自定义路由器扩展到默认路由器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48120614/