페이지

2016년 6월 4일 토요일

Django Rest Framework 파일만 별도로 업로드 하는 기능 구현

Django Rest Framework Image Upload Download
에서 이어집니다.

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

댓글 2개:

  1. 선생님 혹시 질문 받아주실수 있으신가요

    답글삭제
  2. 글 잘 봤습니다!
    venv 버전좀 같이 올려주실수있으신가요?

    답글삭제