使用Django Rest框架对OpenAPI端点进行自定义分组

使用Django Rest框架对OpenAPI端点进行自定义分组,django,django-rest-framework,swagger,swagger-ui,openapi,Django,Django Rest Framework,Swagger,Swagger Ui,Openapi,我有一个Django项目,我正在使用Django REST框架。我正在使用 对于OpenAPI表示,但我认为我的问题与这个包无关,对我来说,它似乎是一个更通用的OpenAPI(但不是100%确定我是否正确) 假设我的URL结构如下: urlpatterns = [ path('admin/', admin.site.urls), path('api/', include([ path('v1/', include([ path('auth/

我有一个Django项目,我正在使用Django REST框架。我正在使用 对于OpenAPI表示,但我认为我的问题与这个包无关,对我来说,它似乎是一个更通用的OpenAPI(但不是100%确定我是否正确)

假设我的URL结构如下:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include([
        path('v1/', include([
            path('auth/', include('rest_framework.urls', namespace='rest_framework')),
            path('jwt-auth/token/obtain', CustomTokenObtainPairView.as_view(), name='token_obtain_pair'),
            path('jwt-auth/token/refresh', CustomTokenRefreshView.as_view(), name='token_refresh'),
            path('home/', include("home.urls"))
        ]))
    ])),

    # OpenAPI endpoints
    path('swagger/', SpectacularSwaggerView.as_view(url_name='schema-swagger-json'), name='schema-swagger-ui'),
    path('swagger.yaml/', SpectacularAPIView.as_view(), name='schema-swagger-yaml'),
    path('swagger.json/', SpectacularJSONAPIView.as_view(), name='schema-swagger-json'),
    path('redoc/', SpectacularRedocView.as_view(url_name='schema-swagger-yaml'), name='schema-redoc'),
]
在相应的swagger UI视图中,我将所有端点分组在api端点下,例如:

如果在v1下添加更多端点,则所有端点都将位于api端点下

我想要实现的是,让Swagger中的端点以不同的方式分组,例如按应用程序分组。因此,我将拥有主页jwt另一个_端点,而不仅仅是api,这样就更容易在招摇过市中导航(当我添加更多端点时,使用当前方法,它只是显示大量URL列表,不太方便用户使用)

我已经读到,这些组是从URL的第一个路径提取的,在我的例子中,这是api,因此,如果我更改URL结构,我可以实现我所需要的


但是,难道没有其他方法可以做到这一点吗?我想保留我的URL结构,并自定义如何使用OpenAPI显示它,因此最终我有了一个按应用程序对端点进行分组的招摇过市的方法,这样就更容易导航并找到您要查找的内容。

事实证明,您可以根据OpenAPI规范,通过更改视图中的标记来控制这一点:

因此,有了drf,您可以使用extend_schema decorator来实现这一点,例如:

class CustomTokenObtainPairView(TokenObtainPairView):
    """
    Takes a set of user credentials and returns an access and refresh JSON web
    token pair to prove the authentication of those credentials.
    """
    @extend_schema(
        operation_id="jwt_obtain",
        ....
        tags=["aTestTag"]
    )
    def post(self, request, *args, **kwargs):
        # whatever

因此,您必须使用此装饰器来扩展要放入自定义组的每个视图中的模式。

您正在使其变得比需要的更困难。在“全局设置”中,可以指定一个公用前缀regex,用于去除不需要的零件。这将为您清理
操作id
标签。在您的情况下,这可能是:

SPECTACULAR_SETTINGS = {
    'SCHEMA_PATH_PREFIX': r'/api/v[0-9]',
}
这将导致标记:home、jwtauth、swagger.json、swagger.yaml

@extend_schema
上的
标记
只是为了方便在需要时偏离默认值。每次操作都要这样做会很麻烦。有关详细信息,请参见设置:

要获得更精细的标记,您可以随时根据自己的喜好子类化
AutoSchema
并覆盖
get_tags(self)
。干杯