본문 바로가기
Programming

Django에서 파일입력 받고 처리하기

by 느리게 걷는 즐거움 2024. 6. 16.
반응형

Django에서 파일을 업로드하고, 업로드된 파일의 내용을 처리한 후 결과 파일을 다운로드할 수 있도록 하는 기능을 구현하기 위해 다음과 같은 단계를 수행할 수 있습니다.

1. Django 프로젝트와 앱 설정
2. 파일 업로드를 위한 모델, 폼, 뷰 및 템플릿 생성
3. 업로드된 파일 처리 및 결과 파일 제공

아래는 이 기능을 구현하기 위한 자세한 코드입니다.

1. Django 프로젝트 및 앱 설정

먼저, Django 프로젝트와 앱을 생성합니다.

django-admin startproject myproject
cd myproject
django-admin startapp myapp

`myproject/settings.py` 파일에서 앱을 등록합니다.

INSTALLED_APPS = [
    ...
    'myapp',
]

2. 모델, 폼, 뷰 및 템플릿 생성

모델;Model (선택 사항) 

파일 업로드를 데이터베이스에 저장하지 않으려면 이 단계는 건너뛰어도 됩니다. `myapp/forms.py` 파일을 생성하고 파일 업로드 폼을 정의합니다.

from django import forms

class UploadFileForm(forms.Form):
    file = forms.FileField()
뷰;View

`myapp/views.py` 파일을 수정하여 파일 업로드와 처리 로직을 구현합니다.

import os
from django.shortcuts import render
from django.http import HttpResponse
from django.core.files.storage import FileSystemStorage
from .forms import UploadFileForm

def upload_file(request):
    if request.method == 'POST' and request.FILES['file']:
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            uploaded_file = request.FILES['file']
            fs = FileSystemStorage()
            filename = fs.save(uploaded_file.name, uploaded_file)
            uploaded_file_path = fs.path(filename)

            try:
                # 파일 처리
                with open(uploaded_file_path, 'r') as f:
                    lines = f.readlines()

                # 숫자로 시작하는 문장을 제거
                filtered_lines = [line for line in lines if not line.lstrip()[0].isdigit()]

                # 결과 파일 저장
                result_filename = f'result_{filename}'
                result_file_path = os.path.join(fs.location, result_filename)
                with open(result_file_path, 'w') as f:
                    f.writelines(filtered_lines)

                # 결과 파일 다운로드 링크 제공
                download_link = fs.url(result_filename)
                return render(request, 'myapp/upload_success.html', {'download_link': download_link})

            finally:
                # 업로드된 파일 삭제
                if os.path.isfile(uploaded_file_path):
                    os.remove(uploaded_file_path)

    else:
        form = UploadFileForm()
    return render(request, 'myapp/upload.html', {'form': form})

 

템플릿(Template)

템플릿 파일을 생성합니다. 

`myapp/templates/myapp/upload.html`
======================================================

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Upload</title>
</head>
<body>
    <h1>Upload File</h1>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Upload</button>
    </form>
</body>
</html>
`myapp/templates/myapp/upload_success.html`
=======================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Upload Success</title>
</head>
<body>
    <h1>Upload Successful</h1>
    <p>Your file has been processed. <a href="{{ download_link }}">Download the result</a></p>
</body>
</html>

 

3. URL 설정

`myapp/urls.py` 파일을 생성하고 URL 패턴을 정의합니다.

from django.urls import path
from . import views

urlpatterns = [
    path('upload/', views.upload_file, name='upload_file'),
]

 

`myproject/urls.py` 파일에 `myapp`의 URL 패턴을 포함시킵니다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls')),
]

4. 파일 시스템 설정

파일 업로드와 다운로드를 위해 `MEDIA_ROOT`와 `MEDIA_URL`을 설정합니다. `myproject/settings.py` 파일을 수정합니다.

import os

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

`myproject/urls.py` 파일에 미디어 파일 서빙을 위한 설정을 추가합니다.

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

이제 서버를 시작하고 파일을 업로드하고 처리된 파일을 다운로드할 수 있습니다.

python manage.py runserver

 

http://127.0.0.1:8000/upload/로 접속하여 파일을 업로드하고, 처리된 파일을 다운로드할 수 있는 링크를 확인할 수 있습니다.

반응형

'Programming' 카테고리의 다른 글

Linux 기본명령어 (B)  (0) 2024.06.20
Linux 기본 명령어 (A)  (0) 2024.06.20
Python Dictionary 사용법  (1) 2024.06.15
Git Submodule 특정 tag로 변경 및 적용  (0) 2024.06.14
파이썬 cscope.files 생성하기  (0) 2024.06.14