【问题标题】:How to make swagger schema for file upload API in django-rest-framework using drf-yasg?如何使用 drf-yasg 在 django-rest-framework 中为文件上传 API 制作招摇模式?
【发布时间】:2019-12-14 09:43:01
【问题描述】:

我找不到任何支持为文件上传 API 创建架构。 Swagger UI 必须有一个按钮,允许测试人员上传文件以进行测试。我使用 firebase 作为数据库,因此序列化程序和模型不会出现。我只使用 Django 的 rest 框架。

我查看了建议使用 Operation 进行文件上传的 drf-yasg 文档。但这是一个非常抽象和晦涩的文档。

【问题讨论】:

    标签: django swagger drf-yasg


    【解决方案1】:

    确保在视图中指定parser_classes。默认情况下,它是不处理文件上传的 JSON 解析器。使用MultiPartParserFileUploadParser

    class MyUploadView(CreateAPIView):
        parser_classes = (MultiPartParser,)
        ...
    
        @swagger_auto_schema(operation_description='Upload file...',)
        @action(detail=False, methods=['post'])
        def post(self, request, **kwargs):
            # Code to handle file
    
    

    【讨论】:

    • 是的,但是我们如何在 drf_yasg 中为此创建架构?
    • @ToughGuy,您应该能够通过视图的类属性 (serializer_class) 或通过 @swagger_auto_schema 装饰器提供序列化程序来添加架构;这个答案对我有帮助。应标记为已接受 imo。
    【解决方案2】:

    看看这个issue。你可以找到如何使用 @swagger_auto_schema 来创建这样的东西

    【讨论】:

      【解决方案3】:

      这是我项目中的工作示例

      from rest_framework import parsers, renderers, serializers, status
      from rest_framework.generics import GenericAPIView
      from rest_framework.response import Response
      
      
      class ContactSerializer(serializers.Serializer):
          resume = serializers.FileField()
      
      
      class ContactView(GenericAPIView):
          throttle_classes = ()
          permission_classes = ()
          parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.FileUploadParser)
          renderer_classes = (renderers.JSONRenderer,)
          serializer_class = ContactSerializer
      
          def post(self, request):
              serializer = self.serializer_class(data=request.data)
              if serializer.is_valid(raise_exception=True):
                  data = serializer.validated_data
                  resume = data["resume"]
                  # resume.name - file name
                  # resume.read() - file contens
                  return Response({"success": "True"})
              return Response({'success': "False"}, status=status.HTTP_400_BAD_REQUEST)
      

      【讨论】:

        猜你喜欢
        • 2022-12-03
        • 2019-08-29
        • 2017-07-24
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2022-09-28
        • 1970-01-01
        • 2021-09-28
        相关资源
        最近更新 更多