gpt4 book ai didi

json - 使用 Django Rest Framework,我如何上传文件并发送 JSON 有效负载?

转载 作者:IT老高 更新时间:2023-10-28 12:53:10 33 4
gpt4 key购买 nike

我正在尝试编写一个可以接收文件以及 JSON 有效负载的 Django Rest Framework API 处理程序。我已将 MultiPartParser 设置为处理程序解析器。

但是,我似乎不能两者都做。如果我将有效负载与文件作为多部分请求一起发送,则 JSON 有效负载在 request.data 中以损坏的方式可用(第一个文本部分直到第一个冒号作为键,其余的是数据)。我可以很好地以标准形式参数发送参数 - 但我的 API 的其余部分接受 JSON 有效负载,我希望保持一致。 request.body 引发 *** RawPostDataException: You cannot access body after reading from request's data stream 时无法读取

例如,请求正文中的文件和此有效负载:
{"title":"Document Title", "description":"Doc Description"}
变成:
<QueryDict: {u'fileUpload': [<InMemoryUploadedFile: 20150504_115355.jpg (image/jpeg)>, <InMemoryUploadedFile: Front end lead.doc (application/msword)>], u'{%22title%22': [u'"Document Title", "description":"Doc Description"}']}>

有没有办法做到这一点?我可以吃我的蛋糕,保持它而不增加任何体重吗?

编辑:有人建议这可能是 Django REST Framework upload image: "The submitted data was not a file" 的副本.它不是。上传和请求是分段完成的,记住文件和上传就可以了。我什至可以使用标准表单变量来完成请求。但我想看看是否可以在其中获取 JSON 有效负载。

最佳答案

对于需要上传文件和发送一些数据的人来说,没有直接的方法可以让它工作。有一个open issue在 json api 规范中。我见过的一种可能性是使用 multipart/related 如图所示 here ,但我认为在 drf 中实现它非常困难。

最后我实现的是将请求作为 formdata 发送。您可以将每个文件作为 file 并将所有其他数据作为文本发送。现在,为了将数据作为文本发送,您可以使用一个名为 data 的键并将整个 json 作为字符串值发送。

模型.py

class Posts(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
caption = models.TextField(max_length=1000)
media = models.ImageField(blank=True, default="", upload_to="posts/")
tags = models.ManyToManyField('Tags', related_name='posts')

serializers.py -> 无需特殊更改,由于可写的 ManyToMany 字段实现,此处不显示我的序列化程序太长。

views.py

class PostsViewset(viewsets.ModelViewSet):
serializer_class = PostsSerializer
parser_classes = (MultipartJsonParser, parsers.JSONParser)
queryset = Posts.objects.all()
lookup_field = 'id'

您将需要如下所示的自定义解析器来解析 json。

utils.py

from django.http import QueryDict
import json
from rest_framework import parsers

class MultipartJsonParser(parsers.MultiPartParser):

def parse(self, stream, media_type=None, parser_context=None):
result = super().parse(
stream,
media_type=media_type,
parser_context=parser_context
)
data = {}
# find the data field and parse it
data = json.loads(result.data["data"])
qdict = QueryDict('', mutable=True)
qdict.update(data)
return parsers.DataAndFiles(qdict, result.files)

postman中的请求示例case2

编辑:

this如果您想将每个数据作为键值对发送,则扩展答案

关于json - 使用 Django Rest Framework,我如何上传文件并发送 JSON 有效负载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30176570/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com