안녕하세요
이번 시간에는 Django에서 파일 업로드 기능을 알아보고 FileUpload 기능을 구현하는 실습을 진행하겠습니다.
0. 사전 준비하기 (템플릿 확장, Bootstrap4)
[Django] Django에서 템플릿 확장의 개념과 템플릿 확장 적용하는 방법 실습하기 (tistory.com)
[Django] Bootstrap4에 대해 알아보고 Django에 Bootstrap4 부트스트랩 적용하기 (tistory.com)
실습을 진행하기 앞서 개발 환경을 맞추고자 Django 템플릿 확장과 Bootstrap4를 적용해야 합니다.
1. 파일 업로드(File Upload)란?
파일 업로드란 클라이언트 측에서 서버 측으로 파일을 전송하는 것을 의미합니다. 파일 업로드는 웹 애플리케이션에서 중요한 역할을 합니다. 예를 들어, 블로그나 게시판 등에서 이미지나 동영상 등의 파일을 업로드하고 보여주는 기능이 그 예입니다.
파일 업로드 기능을 제공하는 웹 애플리케이션은 사용자가 업로드할 파일을 선택할 수 있는 HTML 파일 업로드 폼을 제공합니다. 그리고 이 폼을 통해 사용자가 선택한 파일을 서버로 전송합니다. 서버는 전송받은 파일을 임시 디렉토리에 저장한 후, 이를 영구 저장소(예를 들면 데이터베이스, 파일 시스템 등)에 저장하거나 처리합니다.
2. 파일 업로드(File Upload)의 장점
Django 파일 업로드의 장점은 다음과 같습니다.
1. 편리한 파일 관리
Django는 업로드된 파일을 편리하게 관리할 수 있도록 지원합니다. FileField 또는 ImageField 모델 필드를 사용하면, 파일이 자동으로 서버에 업로드되며, 업로드된 파일의 URL을 쉽게 얻을 수 있습니다.
2. 보안
Django는 업로드된 파일의 보안을 위해 다양한 옵션을 제공합니다. MEDIA_ROOT 및 MEDIA_URL 설정을 이용해 파일 저장 경로 및 URL을 지정할 수 있으며, ALLOWED_HOSTS 설정을 이용해 업로드된 파일이 허용된 호스트에서만 접근 가능하도록 할 수 있습니다.
3. 다양한 파일 형식 지원
Django는 다양한 파일 형식을 지원합니다. 업로드된 파일의 MIME 타입을 검사하여, 악성 파일 업로드를 방지할 수 있습니다.
4. 확장 가능성
Django 파일 업로드 기능은 Django가 제공하는 다양한 라이브러리와 연동하여 확장 가능합니다. 예를 들어, django-storages 라이브러리를 사용하면, Amazon S3, Google Cloud Storage 등의 외부 스토리지에 파일을 저장할 수 있습니다.
Django에서 파일 업로드를 처리하기 위해서는 request.FILES를 이용해 요청으로부터 전송된 파일을 가져와야 합니다.
3. 파일 업로드(File Upload) 앱 생성하기
1. fileupload 앱 생성하기
python manage.py startapp fileupload
File Upload 기능을 구현하기 위해 새로운 앱을 생성합니다.
2. Settings.py 에 앱 등록하기
# settings.py
INSTALLED_APP=[
...
...
...
'fileupload',
]
`settings.py`에 생성한 앱을 등록합니다.
3. fileupload 앱 하위 폴더로 templates/ 만들기
[windows]
우클릭 - 폴더 만들기 - templates - fileupload.html
[linux]
mkdir templates
touch fileupload.html
템플릿 확장에 필요한 templates/ 폴더를 만들어 줍니다.
4. 프로젝트 파일 밑에 media/ 폴더 생성
# 업로드 파일이 저장될 정적 파일 폴더를 생성하기
# [windows]
우클릭 - 폴더 만들기 - media
# [linux]
mkdir media
업로드될 이미지나 미디어 파일이 저장될 media/ 폴더를 만들어 줍니다.
4. Model 만들기
# fileupload/models.py
from django.db import models
class FileUpload(models.Model):
title = models.TextField(max_length=40, null=True)
imgfile = models.ImageField(null=True, upload_to="", blank=True)
content = models.TextField()
def __str__(self):
return self.title
다음과 같이 `models.py`를 만들고 FileUpload 모델을 생성합니다. 모델에는 제목, 업로드될 파일, 내용 등으로 구성하겠습니다. 여기서 [upload_to="", ]는 MEDIA_ROOT를 의미합니다. 그리고 데이터베이스에 반영해주도록 하겠습니다.
4. Migration 적용하기
# 마이그레이션 파일 만들기
python manage.py makemigrations
# 마이그레이션 적용하기
python manage.py migrate
마이그레이션 파일을 만들고 `migrate` 명령어로 데이터베이스에 반영합니다.
5. Model Form을 이용하여 Form 만들기
# fileupload/forms.py
from django.forms import ModelForm
from .models import FileUpload
class FileUploadForm(ModelForm):
class Meta:
model = FileUpload
fields = ['title', 'imgfile', 'content']
Form을 템플릿에서 직접 생성할 수 있지만 저는 Model Form을 이용하여 `FileUploadForm`을 생성하겠습니다.
6. View 만들기
# fileupload/views.py
from django.shortcuts import render, redirect
from .forms import FileUploadForm
from .models import FileUpload
def fileUpload(request):
if request.method == 'POST':
title = request.POST['title']
content = request.POST['content']
img = request.FILES["imgfile"]
fileupload = FileUpload(
title=title,
content=content,
imgfile=img,
)
fileupload.save()
return redirect('fileupload')
else:
fileuploadForm = FileUploadForm
context = {
'fileuploadForm': fileuploadForm,
}
return render(request, 'fileupload.html', context)
다음 코드는 `request.method == 'POST'`일 때 업로드된 파일을 처리하는 함수입니다.
7. 템플릿 만들기
<!-- fileupload/templates/fileupload.html -->
{% extends 'base.html' %}
{% load static %}
{% load bootstrap4 %}
{% block content %}
<div class="container">
<form method="POST" action="{% url 'fileupload' %}" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form fileuploadForm %}
<input type="submit" class="btn btn-primary col-12" value="제출">
</form>
</div>
{% endblock%}
업로드할 파일을 선택할 수 있는 HTML Form을 작성합니다. Form에서는 enctype="multipart/form-data" 속성을 추가해야 합니다. 여기서 enctype="multipart/form-data" 부분을 적어주지 않으면 파일이 업로드 되지 않습니다.
8. URLconf 설정하기
# urls.py
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('', include('fileupload.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# fileupload/urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('fileupload/', fileUpload, name="fileupload"),
]
URLconf를 설정하여 Views.py에서 생성한 upload 함수와 매핑합니다.
9. 파일 저장하기
# settings.py
# ...
# ...
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# ...
# ...
업로드된 파일을 서버에 저장합니다. Django에서는 MEDIA_ROOT와 MEDIA_URL 설정을 통해 파일 업로드를 지원합니다. MEDIA_ROOT는 파일이 저장될 서버의 디렉토리 경로이며, MEDIA_URL은 파일의 URL 경로입니다.
10. 서버 실행하기
py manage.py runserver
브라우저를 열고 `http://127.0.0.1:8000/fileupload/` 다음과 같이 입력합니다.
브라우저에 접속해 화면을 보시면 [title, imgfile, content]에 대한 입력할 수 있는 폼이 보입니다.
아무런 파일을 하나 업로드 해보겠습니다.
이렇게 미디어 폴더 밑에 이미지 파일이 생성되면 파일 업로드 기능이 정상적으로 구현된 것 입니다.
11. 파일 업로드 활용하기 (Grid-Layout 앨범형 게시판)
{% for list in page_obj %}
<div class="item" style="padding-top: 15px;">
<p style="text-align: left; font-size: 0.8em;">
<img src="{{ list.imgfile.url }}" style="width: 180px; height: 150px;" alt=""> <br>
<span style="font-weight: bold;">{{ list.title }}</span> <br>
작성자: {{ list.user }} <br>
작성일: {{ list.created_date|date:"Y-m-d" }} <br>
조회수: {{ list.hit }}
</p>
</div>
{% endfor %}
파일 업로드 기능을 이용해서 업로드된 파일을 img src로 불러와서 사용자에게 보여줄 수도 있습니다.
저는 이 파일 업로드 기능을 이용해서 앨범 형식의 게시판을 만드는 데 사용했습니다.
이렇게 파일 업로드 기능을 이용하여 앨범 게시판 형식의 레이아웃을 만들어 활용할 수 있습니다.
이번 시간에는 Django에서 파일 업로드 기능을 알아보고 FileUpload 기능을 구현하는 실습을 진행했습니다.
혹시 오류가 나는 곳이 있다면 댓글을 달아주시면 확인해보겠습니다.
감사합니다.
'Framework > Django' 카테고리의 다른 글
[Django] 무료 호스팅 파이썬애니웨어(pythonanywhere)로 배포 실습하기 (0) | 2021.08.15 |
---|---|
[Django] 시크릿 키(SECRET_KEY) 분리 실습하기 (0) | 2021.08.15 |
[Django] 리눅스(우분투)에 장고와 아파치 설치 및 연동하기-(3)(MariaDB 연동) (1) | 2021.06.30 |
[Django] 리눅스(우분투)에 장고와 아파치 설치 및 연동하기-(2)(정적 파일, 에러 확인) (0) | 2021.06.30 |
[Django] 리눅스(우분투)에 장고와 아파치 설치 및 연동하기-(1)(wsgi) (0) | 2021.06.30 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!