私は自分のUIからビデオファイルを私のメディアパスにアップロードするAPI(Python 3.5、Django 1.10、DRF 3.4.2)を開発しました。その部分は正常に動作しています。私はこの機能のテストを書こうとしますが、正常に動作させることはできません。この試験ではDjango REST FrameworkのAPIRequestFactoryでファイルのアップロード(テスト)リクエストを生成するには?
#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))
私はいくつかの処理をテストする必要があるので、私は、既存のビデオファイル(「メディア/ TESTFILES/vid.mp4」)を使用し、それをアップロードする必要がありますそれ以来、私はを使って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
に印刷します。
私の結論は、私がAPIRequestFactory
で生成するリクエストが間違っていることです。 FileUploadParser
は、そこから未処理ファイルを取得できません。
私の質問Django REST FrameworkのAPIRequestFactoryでファイルアップロード(テスト)リクエストを生成するにはどうすればいいですか?
多くの人がこれに近い質問をしていますが、提案された回答では成功しませんでした。
この問題に関するお手伝いをさせていただきます。