SSAMKO의 개발 이야기

[django] DB연동없이 파일 업로드 받아 처리하는 API 본문

Django

[django] DB연동없이 파일 업로드 받아 처리하는 API

SSAMKO 2021. 1. 18. 20:33
반응형

대용량 파일을 local DB가 아닌 GCS나 AWS S3에 저장하기 위해,

혹은 mongodb같은 써드파티 DB를 사용하는 서버에서,

 

파일을 단순히 업로드 받아 처리해야할 경우가 있다.

 

그럴경우엔 forms.py나 model.py 작성없이 바로 views.py에서 작성 가능하다.

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST

from .. import FileManager as fm

@csrf_exempt
@require_POST
def recommend_user_prod(request):
    fm.handle_uploaded_file(request.FILES['file'])
    response = HttpResponse("ok")
    response.status_code = 200
    return  response

POST 방식만을 사용할 것이기에 @require_POST 데코레이터를 사용하고,

외부에서 접근 가능하도록 @csrf_exempt 역시 적용했다.

 

업로드 받은 파일을 처리하기 위한 코드를 아래와 같이 별도로 작성했다. (FileManager.py)

import os

def handle_user_recProds_file(file, test=False):
    """Handle the received file below"""
    BASE_DIR = os.path.dirname(os.path.realpath(__file__))
    save_path = os.path.join(BASE_DIR, file.name)
    with open(save_path, 'wb+') as destination:
        for chunk in file.chunks():
            destination.write(chunk)

request.FILES를 통해 POST로 넘어온 file에 접근할 수 있다.

 

API테스트를 위해 아래와 같이 test code를 작성할 수 있다.

import os

from django.urls import reverse
from django.test import TestCase


class AircodeAPITests(TestCase):
	def test_upload(self):
        url = reverse("upload")
        with open('your/file/path/') as f:
            response = self.client.post(url, {'file':f}, format='multipart')
        self.assertEquals(response.status_code, 200)
        self.assertContains(response, 'ok')
        
반응형
2 Comments
  • 프로필사진 Letmesleep 2021.04.14 21:15 혹시 템플릿이랑 연동하는 법도 알려주실 수 있나요...저희가 몽고디비 사용해서 client한테 모델 없이 바로 파일만 저희 작업 환경에서 업로드하고 싶은데....예제 아무리 찾아봐도 찾을 수가 없습니다..
  • 프로필사진 SSAMKO 2021.06.20 21:53 신고 아 장고는 백엔드로만 사용하고 프론트는 따로 제작되서 템플릿은 사용하지 않았는데요 ㅜㅜ
    템플릿을 사용하는 경우에도 view에 위와같은 비즈니스 로직만 추가해주시면 정상작동할거에요~!
댓글쓰기 폼