Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Django에서 모델 파일을 다운로드 가능하게 만드는 방법 완벽 가이드

django-downloadview 패키지를 사용하면 Django 프로젝트에 있는 어떤 파일이든 손쉽게 다운로드 가능한 형태로 제공할 수 있습니다. 서버에 업로드된 파일들을 그대로 호스팅하면서 사용자에게 다운로드 링크를 제공하는 것이죠.

이 글에서는 Django 프로젝트에서 파일을 다운로드할 수 있도록 만드는 방법을 단계별로 알아보겠습니다.

1. 패키지 설치

먼저 아래 명령어로 django-downloadview 패키지를 설치합니다.

pip install django-downloadview

그다음 Django 프로젝트와 앱을 생성하고, 기본 설정을 진행합니다. 앱을 INSTALLED_APPS에 추가하고, settings.py에 미디어 파일 경로를 설정해 주세요.

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

2. 모델 작성하기

models.py

업로드된 파일의 참조를 저장할 모델을 만듭니다.

from django.db import models

# Create your models here.
class Data(models.Model):
    file = models.FileField(upload_to='myfiles/', blank=True)

여기서는 업로드된 파일이 저장되는 경로를 지정하는 FileField를 포함한 모델을 생성했습니다. 테스트를 위해 이 모델에 더미 데이터를 몇 개 등록해 두세요.

3. URL 설정하기

urls.py

from django.urls import path
from . import views
from django.conf import settings
from django.conf.urls.static import static
from django_downloadview import ObjectDownloadView
from .models import Data

download = ObjectDownloadView.as_view(model=Data, file_field='file')

urlpatterns = [
    path('', views.home, name="home"),
    path('download/<int:pk>/', download, name="default"),
]
urlpatterns += static(settings.MEDIA_URL,
                      document_root=settings.MEDIA_ROOT)

여기서는 두 개의 URL 엔드포인트를 만들었습니다. 하나는 프론트엔드 페이지를 렌더링하는 용도이고, 다른 하나는 실제 파일 다운로드를 처리하는 용도입니다.

ObjectDownloadView는 파일을 호스팅할 대상 모델을 인자로 받는 클래스 기반 뷰입니다. 위 코드에서는 Data 모델을 지정하고, 파일이 저장된 필드명으로 'file'을 전달했습니다. 이렇게 하면 URL의 pk 값에 해당하는 모델 인스턴스를 자동으로 찾아 해당 파일을 다운로드 응답으로 반환해 줍니다.

4. 뷰 작성하기

views.py

def home(request):
    return render(request, 'home.html')

간단히 프론트엔드 HTML 페이지를 렌더링하는 뷰입니다.

5. 템플릿 작성하기

home.html

<!DOCTYPE html>
<html>
    <head>
        <title>
            TUT
        </title>
    </head>
    <body>
        <h2>HI</h2>
        <a href="https://127.0.0.1:8000/download/1/">
            Download
        </a>  <!-- '1'은 Data 모델 더미 데이터의 ID입니다 -->
    </body>
</html>

여기서는 미리 만들어 둔 더미 데이터 파일을 참조하는 다운로드 링크를 추가했습니다. URL 끝의 '1'은 파일이 저장되어 있는 모델 인스턴스의 ID(pk)를 의미합니다.

실제 서비스에서는 이 링크를 동적으로 생성하는 것이 좋습니다. 예를 들어 템플릿에서 {% for item in data_list %} 반복문을 사용해 각 객체의 ID에 맞는 다운로드 URL을 자동으로 만들 수 있습니다. 여기서는 개념 이해를 돕기 위해 가장 기본적인 형태로 유지했습니다.

실행 결과

개발 서버를 실행하고(python manage.py runserver) 홈 페이지에 접속한 뒤 Download 링크를 클릭하면, 해당 모델 인스턴스에 저장된 파일이 브라우저를 통해 바로 다운로드됩니다.

이처럼 django-downloadview를 활용하면 복잡한 파일 스트리밍 로직을 직접 구현하지 않고도 몇 줄의 코드만으로 안정적인 파일 다운로드 기능을 완성할 수 있습니다.