通过Django REST API POST C上载媒体文件(.mp4)时出现多值DictKeyError

2024-03-28 13:49:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django REST框架的新手。我创建了一个API,它将MP4文件作为输入,对其进行处理并给出响应。我可以通过API浏览器页面上传文件并得到结果。但是,当我试图通过本地python文件调用API时,出现以下错误:

MultiValueDictKeyError at /api/ 'file'

Request Method: POST

API调用:

import requests
import json
url = 'http://182.xx.xx.xx:8000/api/'
video_file = '/home/lueinuser/Downloads/original.mp4' # 30 MB file in my Local system
payload = {'file' : video_file}
r = requests.post(url=url,data=payload)
print(r.text)

视图.py

class ApiCallingListView(generics.ListCreateAPIView):
    queryset = ApiCallingModel.objects.all()
    serializer_class = ApiCallingSerializer
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request, format=None, *args, **kwargs):
        file_serializer = ApiCallingSerializer(data=request.data)
        file = request.FILES['file']
        fs = FileSystemStorage()
        filename = fs.save(file.name, file)
        uploaded_file_url = settings.MEDIA_ROOT  + '/' + str(filename)
        data_dict = {'video_file': request.FILES}
        request.data['response']= api_wrapper(uploaded_file_url)

        if file_serializer.is_valid():
            file_serializer.save()
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

型号.py

class ApiCallingModel(models.Model):
    file = models.FileField(blank=False, null=False)
    user_id = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    response = models.TextField()
    timestamp = models.DateTimeField(auto_now_add=True)

Tags: 文件importapiurldatamodelsrequestvideo
1条回答
网友
1楼 · 发布于 2024-03-28 13:49:46

您没有正确发送文件:

video_file = '/home/lueinuser/Downloads/original.mp4' # this is just a string, not the content of the file

您需要open这样的文件:

video_file = open('/home/lueinuser/Downloads/original.mp4','rb')

并使用files命名参数调用request.post,而不是作为data

video_file = open('/home/lueinuser/Downloads/original.mp4','rb')
files = {'file': video_file}
r = requests.post(url, files=files)

docs

相关问题 更多 >