8

Swagger 文档说你可以这样做:

https://swagger.io/docs/specification/grouping-operations-with-tags/

但不幸的是 drf-yasg 没有实现这个功能:

https://github.com/axnsan12/drf-yasg/issues/454

据说,我可以添加自定义生成器类,但这是一个非常笼统的答案。现在我看到它drf_yasg.openapi.Swaggerinfo阻塞了,我有想法,这可能是将全局tags部分作为额外的 init 参数的正确位置,但它比自定义生成器类更深,我对此模块缺乏了解

有没有人有这个特定问题的解决方案,或者至少可能是某种教程的链接,如何正确自定义生成器类?

4

2 回答 2

5

不确定这是否正是您正在寻找的,但我认为它可能会有所帮助。

要设置我使用的标签@swagger_auto_schema decorator,可以通过几种不同的方式应用,主要取决于Views项目中使用的类型。完整的详细信息可以在此处的文档中找到。

使用Views派生自APIView时,您可以执行以下操作:

class ClientView(APIView):
    @swagger_auto_schema(tags=['my custom tag'])
    def get(self, request, client_id=None):
        pass

根据文档,限制是tags仅将 strs 列表作为值。所以从这里开始,我相信不再支持标签上的额外属性,如 Swagger 文档中所述,here

无论如何,如果您只需要定义摘要描述来获得如下图所示的内容,则可以使用装饰器或类级别的文档字符串来定义它们。这是一个例子:

带有描述和摘要的标签

在此处输入图像描述

class ClientView(APIView):
    '''
    get:
    Client List serialized as JSON.

    This is a description from a class level docstring.

    '''
    def get(self, request, client_id=None):
        pass
    
    @swagger_auto_schema(
        operation_description="POST description override using 
            decorator",
        operation_summary="this is the summary from decorator",
        
        # request_body is used to specify parameters
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            required=['name'],
            properties={
                'name': openapi.Schema(type=openapi.TYPE_STRING),
            },
        ),
        tags=['my custom tag']
    )
    def post(self, request):
        pass

祝你好运!

于 2020-06-29T00:22:32.737 回答
2

不幸的是,这是drf-yasg的当前问题。

要真正实现这一点,您需要创建自己的模式生成器类:

from drf_yasg.generators import OpenAPISchemaGenerator

class CustomOpenAPISchemaGenerator(OpenAPISchemaGenerator):
  def get_schema(self, request=None, public=False):
    """Generate a :class:`.Swagger` object with custom tags"""

    swagger = super().get_schema(request, public)
    swagger.tags = [
        {
            "name": "api",
            "description": "everything about your API"
        },
        {
            "name": "users",
            "description": "everything about your users"
        },
    ]

    return swagger

确保也将其包含在您的架构视图中

from drf_yasg.views import get_schema_view
from drf_yasg import openapi

schema_view = get_schema_view(
  openapi.Info(
    title="My API",
    default_version='v1',
  ),
  generator_class=CustomOpenAPISchemaGenerator,
)

希望这对你有用!

于 2020-07-02T17:25:11.303 回答