首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用drf-yasg在OpenAPI中获取DRF-api?

如何使用drf-yasg在OpenAPI中获取DRF-api?
EN

Stack Overflow用户
提问于 2021-09-13 19:00:14
回答 2查看 518关注 0票数 0

我正在使用Django Rest框架构建一个简单的API。此接口不存储任何内容,但用作另一个API的代理,用于查询商店是否有牛奶。所以我做了一个简单的序列化程序和视图:

代码语言:javascript
运行
复制
class HasMilkSerializer(serializers.Serializer):
    store = serializers.CharField(min_length=6, max_length=6)
    passage_at = serializers.DateTimeField()

class HasMilkView(CsrfExemptMixin, APIView):
    http_method_names = ['post']
    authentication_classes = [BasicAuthWithKeys]
    serializer_classes = [HasMilkSerializer]

    def post(self, request):
        store = request.data['store']
        visit_at = parser.parse(request.data['visit_at'])
        return Response({'store': store, 'has_milk': has_milk(store, visit_at)})

这很好用,所以现在我想使用drf-yasg在OpenAPI规范中记录这一点。我已经安装了它,swagger显示了一些信息,但它没有显示任何关于参数或响应的规范(见下面的截图)。

我需要做什么才能让swagger正确地记录我的端点?我是否需要在swagger中进一步定义它,或者我是否需要更改端点,以便swagger可以正确地记录它?

EN

回答 2

Stack Overflow用户

发布于 2021-09-13 21:28:56

首先要做几件事:

serializer_classes.

  • But (或从它继承的其他类)中,定义要使用的序列化程序类的属性是serializer_class,而不是serializer_class。因为您在这里没有使用序列化程序类,所以在我看来,您真的不需要定义它。

就问题而言,由于您使用的是APIView类,因此drf-yasg不能使用模型查询集推断请求和响应正文。因此,您必须使用swagger_auto_schema装饰器手动添加响应和请求正文。你可以这样做:

代码语言:javascript
运行
复制
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema


class HasMilkView(CsrfExemptMixin, APIView):
    http_method_names = ['post']
    authentication_classes = [BasicAuthWithKeys]
    serializer_classes = [HasMilkSerializer]
    
    @swagger_auto_schema(
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            required=['store', 'visit_at'],
            properties={
                'store': openapi.Schema(type=openapi.TYPE_STRING,
                                        max_length=6),
                'visit_at': openapi.Schema(type=openapi.TYPE_STRING, 
                                           format=FORMAT_DATE)
            }
        ),
        responses={
            200: openapi.Schema(
                type=openapi.TYPE_OBJECT,
                properties={
                    'store': openapi.Schema(type=openapi.TYPE_STRING,
                                        max_length=255),
                    'has_milk': openapi.Schema(type=openapi.TYPE_BOOLEAN)
                }
            )
        }
    )
    def post(self, request):
        store = request.data['store']
        visit_at = parser.parse(request.data['visit_at'])
        return Response({'store': store, 'has_milk': has_milk(store, visit_at)})
票数 1
EN

Stack Overflow用户

发布于 2021-09-13 21:15:05

APIView没有serializer_classes属性,swagger无法自动检测您的序列化程序。您可以使用其他类型的视图,如GenericAPIView或ModelViewSet。

如果你想使用APIView,你应该使用@swagger_auto_schema装饰器来定义你的请求/响应参数:

代码语言:javascript
运行
复制
    @swagger_auto_schema(request_body=HasMilkSerializer)
    def post(self, request):
        store = request.data['store']
        visit_at = parser.parse(request.data['visit_at'])
        return Response({'store': store, 'has_milk': has_milk(store, visit_at)})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69167836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档