微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过 PUT 在 Django DRF 中测试 mp3 上传?

如何解决如何通过 PUT 在 Django DRF 中测试 mp3 上传?

我尝试测试 mp3 修改(因此是 PUT)。到目前为止,我有以下几点:

client = Client()
with open('my_modified_audio.mp3','rb') as fp:
    response = client.put(
            f"/resource/{resource_id}/",data={'audio': fp})

但是,我得到 response.status_code == 415 因为 DRF 的 ModelViewSet 中的序列化器行
serializer = self.get_serializer(instance,data=request.data,partial=partial)
失败
rest_framework.exceptions.UnsupportedMediaType: Unsupported media type "application/octet-stream" in request.

我尝试设置 format="multipart",将内容类型设置为 json 或表单编码,但到目前为止没有任何帮助。 Resource 模型使用 FileField:

class Resource(models.Model):
    audio = models.FileField(upload_to='uploads')

我怎样才能使这个 put 请求起作用?

解决方法

我认为以下方法可行:

客户:

import requests
...

client = Client()
files = [('audio': open('my_modified_audio.mp3','rb'))]
url = f"/resource/{resource_id}/"

# response = client.put(url,data=None,files=files)
# You can test it using the `requests` instead of Client()
response = requests.put(url,files=files)

序列化器:

class AudioSerializer(serializers.Serializer):
    """ AudioSerializer """
    audio = serializers.FileField(...)

    def create(self,validated_data):
        ...

    def update(self,instance,validated_data):
        ...

视图:

from rest_framework.generics import UpdateAPIView

class AudioView(UpdateAPIView):
   ...
   parser_classes = (FormParser,MultiPartParser)
   serializer_class = AudioSerializer
   ...
,

受到@athansp 回答的启发,我比较了 client.postclient.put 的源代码,结果发现 put 的实现与 post 略有不同,因此使用 put 提交文件的可行方法是:

from django.test.client import MULTIPART_CONTENT,encode_multipart,BOUNDARY

client = Client()
with open('my_modified_audio.mp3','rb') as fp:
    response = client.put(
        f"/resource/{resource_id}/",data=encode_multipart(BOUNDARY,{
            'other_field': 'some other data','audio': fp,}),content_type=MULTIPART_CONTENT
    )

哈哈。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。