gpt4 book ai didi

django - 在 Django Rest Framework 中跨应用程序将自定义路由器扩展到默认路由器

转载 作者:行者123 更新时间:2023-12-04 01:13:54 24 4
gpt4 key购买 nike

我遇到了一个关于将 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 = {}
),
]

这将无法正确处理我的扩展。例如, GETPATCH每当我扩展路由器时都不会被识别为允许的方法,但是当我不扩展而只使用自定义路由器时,一切正常。

因此,我的问题是,如何处理跨单独应用程序扩展自定义路由器,但仍保持良好的可浏览 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com