【问题标题】:Django REST Framework file upload causing an "Unsupported media type 'multipart/form-data'" errorDjango REST Framework 文件上传导致“不支持的媒体类型'multipart/form-data'”错误
【发布时间】:2016-08-21 06:37:20
【问题描述】:

我是 Django 和 Django REST 框架的新手。我有以下序列化程序类,我用它来上传文件以及其他信息。但是,当我使用上传的文件运行 API 端点时,结果是这样的:

HTTP 415 Unsupported Media Type
Allow: POST, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "detail": "Unsupported media type \"multipart/form-data; boundary=----WebKitFormBoundaryybZ07gjZAqvcsZw3\" in request."
}

我尝试通过谷歌搜索解决此问题,但无法找到解决方案,因此这是我的序列化程序和 API 视图。

序列化器:

class ExampleSerializer(serializers.Serializer):

    example_id = serializers.IntegerField()
    description = serializers.CharField(allow_blank=True)
    example_file = serializers.FileField(allow_empty_file=True)

    def create_requirement_line(self):
        request = self.context['request']

        requirement_line = ExampleService().example_method(
            example_id=self.validated_data['example_id'],
            description=self.validated_data['description'],
            example_file=self.validated_data['example_file']
    )
    return requirement_line

查看:

 class RequirementLineAPIView(BaseCreateAPIView):

    serializer_class = ExampleSerializer
    parser_classes = (FormParser,)

    def post(self, request, format=None,*args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            try:
                example_variable = serializer.example_method()
                return Response(example_variable, status=status.HTTP_200_OK)

            except ValidationError as e:
                return Response(e.message, status=status.HTTP_400_BAD_REQUEST)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)    

【问题讨论】:

  • parser_classes = (FormParser,) 行中的逗号是什么意思?
  • 我不确定,但如果我删除“逗号”,则 'type' object is not iterable 正在发生。 @kpie
  • 你能发布更多你的代码吗?
  • 你能具体点吗?因为这就是我的序列化程序类和 api 视图。 @kpie
  • 你的类有 2 个变量,在提供的代码中都没有引用它们。只是让我有点好奇……

标签: python django rest django-rest-framework


【解决方案1】:

如果您要发送 multipart/form-data,您应该使用 MultiPartParser 而不是 FormParser。

【讨论】:

  • 感谢您的回答,如果我使用 MultiPartParser,那么我会收到以下错误 UnicodeDecodeError at /api/requirement-header-line/ 'ascii' codec can't decode byte 0xff in position 76: ordinal not in range(128) 提及,我已经应用了自定义服务方法,有什么我必须在我的服务方式?
  • 您能提供更多信息吗?喜欢您尝试发送的数据吗?
  • 好的,具体来说,我发送一个整数(比如 30)作为我的example_id,并将“这是一个描述”作为description 和一个 .pptx 或一个 .pdf 文件发送作为example_file。 @Ivan Genchev
  • 应该可以解决这个问题:REST_FRAMEWORK = { ... 'UNICODE_JSON': False }
  • 但这与您的原始问题无关,而且该问题取决于您正在使用的设置、python 版本和 drf 版本...
【解决方案2】:

尝试使用 FileField 解析器 Using Parsers in django rest

【讨论】:

    【解决方案3】:

    如果在访问 request.DATA 或 request.FILES 时没有解析器可以处理请求数据的内容类型,则引发。

    check Django REST Framework2 documentation

    导入合适的解析器

    from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
    
    class SampleView(APIView):
        parser_classes = (MultiPartParser,FormParser,JSONParser)
    

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 2020-06-12
      • 2015-07-21
      • 2021-05-18
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      相关资源
      最近更新 更多