에서 이어집니다.
functional_tests/tests_upload.py
- 우선 기존테스트를 복사해서 test_upload_file 로 테스트를 하나 만듭니다.
- title만 먼저 등록하고
- /imageuploads/{pk}/upload 로 파일만 전송하도록 수정합니다.
- 업로드한 파일을 지우고
- 파일없이 요청하면 400 코드를 반환하게 합니다.
def test_upload_file(self):
# title 만 입력하여 추가한다.
r = requests.post(self.live_server_url + '/imageuploads/',
data={
'title':'Test Image'
}
)
self.assertEqual(201, r.status_code) # created
url = r.json()['url']
# /imageuploads/{pk}/upload 로 파일을 전송한다.
file = open('functional_tests/test_image.png','rb')
files = [
('imagefile', ('test_image.png', file, 'image/png'))
]
r = requests.post(url + 'upload/',
files=files
)
file.close()
self.assertEqual(200, r.status_code)
self.assertEqual('upload success', r.json()['status'])
# 업로드된 파일을 지운다.
r = requests.get(url)
imagefile = r.json()['imagefile']
imagefilepath = imagefile.__str__().replace(url,'')
imagefile_realpath = os.path.abspath(os.path.join(MEDIA_ROOT, imagefilepath))
os.remove(imagefile_realpath)
# 파일없이 요청하면 400 코드를 반환한다.
r = requests.post(url + 'upload/')
self.assertEqual(400, r.status_code)
self.assertEqual('no file', r.json()['status'])
views.py
- request.data 에서 첫번째 키 값을 찾고
- 키 값이 있으면 저장해주고
- 없으면 400 코드를 반환합니다.
from rest_framework.response import Response전체 소스코드는 아래 링크를 확인하세요.
from rest_framework import status
@detail_route(methods=['post'])
def upload(self, request, pk=None):
key = None
for k in request.data:
key = k
break
if key:
r = self.get_object()
r.imagefile = request.data[key]
r.save()
return Response({'status': 'upload success'})
else:
return Response({'status': 'no file'}, status=status.HTTP_400_BAD_REQUEST)
https://github.com/kyuhyung-park/djangorestframework_practice/tree/only_file_upload
선생님 혹시 질문 받아주실수 있으신가요
답글삭제글 잘 봤습니다!
답글삭제venv 버전좀 같이 올려주실수있으신가요?