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

标签 django django-rest-framework

我遇到了一个关于将 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/

相关文章:

python - Django Rest Framework 中的序列化器字段过滤?

python - Django 变量与预期不匹配

Django-rest-framework-social-oauth2

python - Django REST Framework (ModelViewSet), 405 方法不允许

python - 自定义身份验证方法或者其他方法可以做到同样的事情? Django

python - Django 模型 : Use multiple values as a key?

python - 为什么 Unicorn/Gunicorn 提供静态内容的速度很慢?

python - 如何为 REST View 类使用 @condition 装饰器

python - 如何使用 models.py 、 serializers.py 和 views.py 将解析的 json 数组值保存到 django python Rest api 中的数据库

django - CSRF token 在第二篇 Django Rest Framework 上失败