我开发了一个API(Python 3.5,Django 1.10,DRF 3.4.2),当我从我的UI请求时,它会将视频文件上传到我的媒体路径。那部分工作正常。我尝试为此功能编写一个测试,但无法成功运行。
#views.py
import os
from rest_framework import views, parsers, response
from django.conf import settings
class FileUploadView(views.APIView):
parser_classes = (parsers.FileUploadParser,)
def put(self, request, filename):
file = request.data['file']
handle_uploaded_file(file, filename)
return response.Response(status=204)
def handle_uploaded_file(file, filename):
dir_name = settings.MEDIA_ROOT + '/scene/' + filename + '/cam1'
new_filename = 'orig.mp4'
if not os.path.exists(dir_name):
os.makedirs(dir_name)
file_path = os.path.join(dir_name, new_filename)
with open(file_path, 'wb+') as destination:
for chunk in file.chunks():
destination.write(chunk)
和
#test.py
import tempfile
import os
from django.test import TestCase
from django.conf import settings
from django.core.files import File
from django.core.files.uploadedfile import SimpleUploadedFile
from rest_framework.test import APIRequestFactory
from myapp.views import FileUploadView
class UploadVideoTestCase(TestCase):
def setUp(self):
settings.MEDIA_ROOT = tempfile.mkdtemp(suffix=None, prefix=None, dir=None)
def test_video_uploaded(self):
"""Video uploaded"""
filename = 'vid'
file = File(open('media/testfiles/vid.mp4', 'rb'))
uploaded_file = SimpleUploadedFile(filename, file.read(), 'video')
factory = APIRequestFactory()
request = factory.put('file_upload/'+filename,
{'file': uploaded_file}, format='multipart')
view = FileUploadView.as_view()
response = view(request, filename)
print(response)
dir_name = settings.MEDIA_ROOT + '/scene/' + filename + '/cam1'
new_filename = 'orig.mp4'
file_path = os.path.join(dir_name, new_filename)
self.assertTrue(os.path.exists(file_path))
在这个测试中,我需要使用现有的视频文件('media/testfiles/vid.mp4')并上传它,因为我需要在视频数据上测试一些处理过程:这就是为什么我使用mkdtemp
重置MEDIA_ROOT
的原因。测试失败,因为文件没有被上传。在我的
views.py
的def put
中,当我打印request
时,我得到<rest_framework.request.Request object at 0x10f25f048>
,当我打印request.data
时,我什么也没有得到。但是,如果我从我的视图中删除FileUploadParser
并在我的测试中使用request = factory.put('file_upload/' + filename, {'filename': filename}, format="multipart")
,当我打印request.data
时,我得到<QueryDict: {'filename': ['vid']}>
。因此,我的结论是,我用
APIRequestFactory
生成的请求不正确。FileUploadParser
无法从中检索原始文件。因此,我的问题是:如何使用Django REST Framework的APIRequestFactory生成文件上传(测试)请求? 许多人在SO上提出了类似于这个问题的问题,但我没有成功地使用所提出的答案。
对于这个问题的任何帮助都将不胜感激!