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 |