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')
        
반응형
Comments