我遇到了将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
这将无法正确处理我的扩展程序。举个例子,每当我扩展路由器时,App1Router
和class App1Router(SimpleRouter):
routes = [
Route(
url = r'^{prefix}{trailing_slash}$',
mapping = {
'get': 'retrieve',
'post': 'create',
'patch': 'partial_update',
},
name = '{basename}-user',
initkwargs = {}
),
]
都不被认为是允许的方法,但是当我不扩展,但只使用自定义路由器时,一切正常。
我的问题是,如何在单独的应用程序中处理扩展自定义路由器,但仍然保持良好的可浏览API?
路由器注册表只是一个标准的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
您是否尝试过保留SimpleRouter的默认路由?
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning'
}
我在你的代码中没有看到这个:
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。