【问题标题】:Django Rest Framework: How to enable swagger docs for function based viewsDjango Rest Framework:如何为基于函数的视图启用 swagger 文档
【发布时间】:2020-03-26 03:09:10
【问题描述】:

我通过了Django REST Swagger 2.1.2 documentation。当我尝试使用基于类的视图时,它运行良好。

但我没有找到任何关于如何为基于函数的视图启用 swagger 的参考,如下所示:

@api_view(['GET', 'POST'])
def app_info(request): 
    ...
    return response

我的大部分views.py 都充满了基于函数的视图,就像上面一样。

任何有关如何启用相同功能的帮助将不胜感激。谢谢!

我正在使用 Django:1.8; Django REST Swagger:2.1.2; DRF:3.6.2

【问题讨论】:

    标签: python django django-rest-framework swagger django-swagger


    【解决方案1】:

    你应该可以使用@renderer_classes装饰器:

    from rest_framework_swagger import renderers
    from rest_framework.decorators import api_view, renderer_classes
    
    
    @api_view(['GET', 'POST'])
    @renderer_classes([renderers.OpenAPIRenderer, renderers.SwaggerUIRenderer])
    def app_info(request): 
        ...
        return response
    

    另外,值得一提的是,如果你不想在每个视图上都使用这个装饰器,你可以指定DEFAULT_RENDERER_CLASSES in settings

    编辑:它似乎毕竟在文档中。查看此页面的最底部:https://django-rest-swagger.readthedocs.io/en/latest/schema/

    【讨论】:

    • 根据您的编辑:我怎么会错过...!感谢您的回答。
    【解决方案2】:

    我不熟悉swagger,但你可以尝试这样使用装饰器:

    class TestView(View):
        @api_view(['GET', 'POST'])
        def get(self, request):
            ....
    

    from django.utils.decorators import method_decorator
    class TestView(View):
        @method_decorator(api_view(['GET', 'POST'])
        def get(self, request):
            ....
    

    ----------------------------------------------- -----------------------------------------

    对不起,我可能误解了你的问题。根据文档,如果您想在基于类的视图中启用招摇。有例子:

    from rest_framework.permissions import AllowAny
    from rest_framework.response import Response
    from rest_framework.schemas import SchemaGenerator
    from rest_framework.views import APIView
    from rest_framework_swagger import renderers
    
    
    class SwaggerSchemaView(APIView):
        permission_classes = [AllowAny]
        renderer_classes = [
            renderers.OpenAPIRenderer,
            renderers.SwaggerUIRenderer
        ]
    
        def get(self, request):
            generator = SchemaGenerator()
            schema = generator.get_schema(request=request)
            return Response(schema)
    

    restframework 将使用这两个 renderer_classes 来渲染 Json 和 UI。

    【讨论】:

    • 谢谢。我会试试的。很可能它不会工作,让我们看看。
    • 根据您的编辑:我已经知道了。我的问题是如何为基于函数的视图启用招摇。
    【解决方案3】:

    在你的views.py中添加以下内容

    进口

    from rest_framework.schemas import AutoSchema
    from rest_framework.compat import coreapi
    
    #creating custom class 
    class CustomSampleSchema(AutoSchema):
        def __init__(self):
            super(CustomSampleSchema, self).__init__()
    
        def get_manual_fields(self, path, method):
            extra_fields = [
                coreapi.Field('field1', required=True, location='form', description='', type='', example=''),
                coreapi.Field('field2', required=False, location='form', description='', type='', example=''),
                coreapi.Field('field3', required=False, location='form', description='', type='', example='')
    
            ]
            manual_fields = super().get_manual_fields(path, method)
            return manual_fields + extra_fields
    

    这是您正在为其编写 swagger doc 的函数。

    @api_view(['post'])
    @schema(CustomSampleSchema())
    @csrf_exempt
    def func_name(request, param):
    """
    Your function definition below
    """
    

    示例 json 输入

    {"name": "['name1', ]",
    "places": "['place1', 'place2']",
    "key":"12345"}
    

    【讨论】:

    • 有没有办法添加描述和响应类型?