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

问题描述 投票:12回答:3

我遇到了将API应用分开的问题,同时仍然可以使用可浏览的API进行导航。

我之前在我的主应用程序中使用了一个单独的qazxsw poi文件,其中包含qazxsw poi的以下扩展名。

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

这将无法正确处理我的扩展程序。举个例子,每当我扩展路由器时,App1Routerclass App1Router(SimpleRouter): routes = [ Route( url = r'^{prefix}{trailing_slash}$', mapping = { 'get': 'retrieve', 'post': 'create', 'patch': 'partial_update', }, name = '{basename}-user', initkwargs = {} ), ] 都不被认为是允许的方法,但是当我不扩展,但只使用自定义路由器时,一切正常。

我的问题是,如何在单独的应用程序中处理扩展自定义路由器,但仍然保持良好的可浏览API?

django django-rest-framework
3个回答
1
投票

路由器注册表只是一个标准的python列表,所以你可以直接在registy上调用YourRouter.registry.extend()而无需子类化DefaultRouter,检查DRF GET的来源。由于注册表是一个列表,当你扩展注册表时,你在python列表的顶部添加另一个python列表,这意味着调用YourRouter.registry.extend(app_router.registry)。对我有用的是从其他应用程序(SimpleRouters)导入路由器并将其添加到默认路由器注册表之上。

PATCH

如果您试图通过添加前缀来为您的应用添加版本控制,我建议您查看DRF中可用的版本控制架构 - 也许它可以满足您的需求here

例如,在您的设置中启用了URLPathVersioning

#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)),

]

上面的代码片段中的urlpatterns列表看起来就像那样

DRF versioning

0
投票

您是否尝试过保留SimpleRouter的默认路由?

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning'
}

0
投票

我在你的代码中没有看到这个: urlpatterns = [ path('api/<version>/', include(router.urls)), ]

实际上你的导入说不然 class App1Router(SimpleRouter): def __init__(self): super(SimpleRouter, self).__init__() self.routes.insert(0, Route( url = r'^{prefix}{trailing_slash}$', mapping = { 'get': 'retrieve', 'post': 'create', 'patch': 'partial_update', }, name = '{basename}-user', initkwargs = {} ))

我会更改App1Router以扩展app1.urls.router或DefaultRouter。

© www.soinside.com 2019 - 2024. All rights reserved.