如何使用drf-yasg在Django Rest Framework中为文件上传API创建Swagger模式?

5

我找不到任何支持制作文件上传API模式的文档。

Swagger UI必须有一个按钮,允许测试人员上传文件进行测试。我使用Firebase作为数据库,因此序列化程序和模型并不适用。我只使用Django的rest framework。

我查看了drf-yasg的文档,建议使用操作(Operation)来进行文件上传。但它是非常抽象和晦涩的文档。

4个回答

14

请确保在您的视图中指定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中为此创建模式? - Tough Guy
1
@ToughGuy,你可以通过在视图的类属性(“serializer_class”)中提供你的序列化器,或者通过“@swagger_auto_schema”装饰器添加模式。这个答案对我很有帮助。在我看来应该被标记为已接受。 - IgorNikolaev

2

这是我的项目中的工作示例

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)

1

看一下这个问题。你可以了解如何使用@swagger_auto_schema创建类似这样的内容。

enter image description here


我使用了相同的代码,但是当我通过Swagger上传文件时,我的request.FILES没有显示任何内容。如果我使用Postman,一切都正常工作。 - sap

0
使用@swagger_auto_schema并使用以下manual_parameters来上传文件 manual_parameters=[openapi.Parameter(name="file",in_=openapi.IN_FORM,type=openapi.TYPE_FILE,required=True,description="Document")]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接