Django Rest Framework不会像标准POST请求那样对Multipart请求中的JSON字段进行解码

哈雷尔

当我提交了一个POST请求Content-Typeapplication/jsonJSON对象被表示为类型的字典,数组作为数组等等。这是伟大的- ,因为它应该我在服务器上的数据被解码成原生的Python。
但是,当我向我的API发出一个MultiPart发布请求时,该请求当然也包含一个文件,服务器上不会解码任何包含JSON /对象的字段,而我剩下的字符串需要我自己解码。我的应用程序的性质意味着我不能总是知道我将要获得哪些字段。

我的问题是-如何提交包含文件的多部分请求,同时又保留DRF在某些字段中解码JSON数据的功能?我试过一起使用所有3个主要的解析器,但这没有用(通过将API视图的parser_classes设置为它们: parser_classes = (MultiPartParser, JSONParser, FormParser)

以下是一些通过Chrome的开发工具发送的示例请求:

标准发布(不是分段的,没有文件): {"first_name":"Test","last_name":"Shmest","email":[{"channel_type":"Email","value":"[email protected]","name":null,"default":false}],"company":{"position":"Manager","id":"735d2b5f-e032-4ca8-93e4-c7773872d0cc","name":"The Compapa"},"access":{"private":true,"users":[10,1]},"description":"Nice guy!!","address":{"city":"San Fanfanfo","zip":"39292","country":"United States of America","state":"CA","map_url":null,"country_code":"US","address":"123 This street"},"phone":[{"default":false,"type":"Phone","id":"70e2b437-6841-4536-9acf-f6a55cc372f6","value":"+141512312345","name":null}],"position":"","department":"","supervisor":"","assistant":"","referred_by":"","status":"","source":"","category":"Lead","do_not_call":false,"do_not_text":false,"do_not_email":false,"birthday":null,"identifier":""} DRF可以很好地读取此有效负载,并且所有值都设置为它们的本机等效项。

与文件和字段之一组成的多部分是JSON编码的对象:

------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="file"; filename="image.png"
Content-Type: image/png


------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="first_name"

Test
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="last_name"

Shmest
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="email"

[{"channel_type":"Email","value":"[email protected]","name":null,"default":false}]
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="company"

{"position":"Manager","id":"735d2b5f-e032-4ca8-93e4-c7773872d0cc","name":"The Compapa"}
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="access"

{"private":true,"users":[10,1]}
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="description"

Nice guy!!
------WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="address"

我正在寻找的是看是否有某种方法可以像常规POST中那样在多部分请求中自动进行JSON解码,然后再深入研究手动解码所有字段以检查它们是否为JSON。在提出请求之前,我将要获得的大多数字段都是未知的,因为每个用户可能具有不同的字段组合。

哈雷尔

我创建了一个新的Parser对象,以处理带有包含JSON的字段的MultiPart文件上载的情况。如果有人需要,代码在下面。

import json
from rest_framework.parsers import BaseParser, DataAndFiles
from django.conf import settings
from django.http.multipartparser import MultiPartParser as DjangoMultiPartParser, MultiPartParserError
from django.utils import six
from rest_framework.exceptions import ParseError


class MultiPartJSONParser(BaseParser):
    """
    Parser for multipart form data which might contain JSON values
    in some fields as well as file data.
    This is a variation of MultiPartJSONParser, which goes through submitted fields
    and attempts to decode them as JSON where a value exists. It is not to be used as a replacement
    for MultiPartParser, only in cases where MultiPart AND JSON data are expected.
    """
    media_type = 'multipart/form-data'

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Parses the incoming bytestream as a multipart encoded form,
        and returns a DataAndFiles object.
        `.data` will be a `QueryDict` containing all the form parameters, and JSON decoded where available.
        `.files` will be a `QueryDict` containing all the form files.
        """
        parser_context = parser_context or {}
        request = parser_context['request']
        encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)
        meta = request.META.copy()
        meta['CONTENT_TYPE'] = media_type
        upload_handlers = request.upload_handlers

        try:
            parser = DjangoMultiPartParser(meta, stream, upload_handlers, encoding)
            data, files = parser.parse()
            for key in data:
                if data[key]:
                    try:
                        data[key] = json.loads(data[key])
                    except ValueError:
                        pass
            return DataAndFiles(data, files)
        except MultiPartParserError as exc:
            raise ParseError('Multipart form parse error - %s' % six.text_type(exc))

解析器可以像在其他视图中一样在API视图中使用:

parser_classes = (MultiPartJSONParser, JSONParser , FormParser)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django Rest Framework不会像标准POST请求那样对Multipart请求中的JSON字段进行解码

来自分类Dev

如何从 Django Rest Framework 接收 POST 请求?

来自分类Dev

根据请求类型更改Django REST Framework ModelSerializer中的字段?

来自分类Dev

在Django REST Framework中何处更改POST请求的响应

来自分类Dev

如何在Django REST Framework中设置POST请求的权限?

来自分类Dev

在Django Rest Framework中测试PUT请求

来自分类Dev

在 Django REST Framework 中更新/放置请求

来自分类Dev

唯一模型字段上的Django Rest Framework PUT请求

来自分类Dev

Django REST Framework:使用列表测试POST请求时出错

来自分类Dev

每个用户请求的Django Rest Framework指标

来自分类Dev

Django Rest Framework JWT 400错误请求

来自分类Dev

向 Django Rest Framework 发送 PATCH 请求

来自分类Dev

JSON API标准的Django Rest Framework方法

来自分类Dev

发布请求Django REST框架

来自分类Dev

Ajax 请求 django rest 框架

来自分类Dev

Django Rest 框架请求验证

来自分类Dev

Django REST空字段

来自分类Dev

Django Rest Framework and JSONField

来自分类Dev

Django Rest Framework API

来自分类Dev

Django Rest Framework的ModuleNotFoundError

来自分类Dev

Django Rest Framework:默认外键为请求中的值

来自分类Dev

在Django Rest Framework中的任何类型的请求之前执行操作

来自分类Dev

Django Rest Framework:如何在GET请求的响应中添加自定义字段?

来自分类Dev

Django Rest Framework:如何在GET请求的响应中添加自定义字段?

来自分类Dev

使用JWT令牌在Django Rest Framework中对POST请求的未经授权的响应

来自分类Dev

在 Django Rest Framework 中处理来自可浏览 API 的 POST 请求查询参数

来自分类Dev

Django Rest Framework CharFilter JSON

来自分类Dev

来自Django Rest Framework的JSON

来自分类Dev

django或django-rest-framework中必需的POST参数

Related 相关文章

  1. 1

    Django Rest Framework不会像标准POST请求那样对Multipart请求中的JSON字段进行解码

  2. 2

    如何从 Django Rest Framework 接收 POST 请求?

  3. 3

    根据请求类型更改Django REST Framework ModelSerializer中的字段?

  4. 4

    在Django REST Framework中何处更改POST请求的响应

  5. 5

    如何在Django REST Framework中设置POST请求的权限?

  6. 6

    在Django Rest Framework中测试PUT请求

  7. 7

    在 Django REST Framework 中更新/放置请求

  8. 8

    唯一模型字段上的Django Rest Framework PUT请求

  9. 9

    Django REST Framework:使用列表测试POST请求时出错

  10. 10

    每个用户请求的Django Rest Framework指标

  11. 11

    Django Rest Framework JWT 400错误请求

  12. 12

    向 Django Rest Framework 发送 PATCH 请求

  13. 13

    JSON API标准的Django Rest Framework方法

  14. 14

    发布请求Django REST框架

  15. 15

    Ajax 请求 django rest 框架

  16. 16

    Django Rest 框架请求验证

  17. 17

    Django REST空字段

  18. 18

    Django Rest Framework and JSONField

  19. 19

    Django Rest Framework API

  20. 20

    Django Rest Framework的ModuleNotFoundError

  21. 21

    Django Rest Framework:默认外键为请求中的值

  22. 22

    在Django Rest Framework中的任何类型的请求之前执行操作

  23. 23

    Django Rest Framework:如何在GET请求的响应中添加自定义字段?

  24. 24

    Django Rest Framework:如何在GET请求的响应中添加自定义字段?

  25. 25

    使用JWT令牌在Django Rest Framework中对POST请求的未经授权的响应

  26. 26

    在 Django Rest Framework 中处理来自可浏览 API 的 POST 请求查询参数

  27. 27

    Django Rest Framework CharFilter JSON

  28. 28

    来自Django Rest Framework的JSON

  29. 29

    django或django-rest-framework中必需的POST参数

热门标签

归档