Flask에서 폼 처리와 파일 업로드 기능 구현하기
안녕하세요, 소프트웨어 공장입니다. 오늘은 Flask 애플리케이션에서 폼 처리와 파일 업로드 기능을 구현하는 방법에 대해 알아보겠습니다. Flask는 간단하면서도 강력한 기능을 제공하기 때문에, 파일 업로드와 같은 기능도 쉽게 구현할 수 있습니다.
Flask에서 파일 업로드를 위한 준비 작업
파일 업로드를 구현하려면 몇 가지 필수적인 준비 작업이 필요합니다. Flask에서는 기본적으로 Flask
모듈과 함께 Flask-WTF
를 사용하여 폼을 관리하거나, 순수 Flask 폼을 사용해도 됩니다.
필수 라이브러리 설치
pip install flask
pip install flask-wtf
위 명령어를 통해 Flask와 Flask-WTF를 설치합니다. Flask-WTF는 Flask에서 폼 처리를 보다 쉽게 만들어 주는 라이브러리입니다.
기본 프로젝트 구조
다음과 같은 프로젝트 구조를 추천합니다:
project/
├── app.py
├── templates/
│ └── upload.html
└── uploads/
app.py
: Flask 애플리케이션의 메인 파일templates/
: HTML 템플릿 디렉토리uploads/
: 업로드된 파일을 저장할 디렉토리
코드 구현
1. Flask 애플리케이션 설정
파일 업로드를 지원하려면 Flask 애플리케이션의 몇 가지 설정을 추가해야 합니다:
from flask import Flask, render_template, request, redirect, url_for
import os
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads/' # 업로드 파일 저장 경로
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 최대 업로드 크기 16MB
# 업로드 폴더가 없으면 생성
if not os.path.exists(app.config['UPLOAD_FOLDER']):
os.makedirs(app.config['UPLOAD_FOLDER'])
2. HTML 폼 작성
templates/upload.html
파일을 작성합니다. 이 HTML 폼은 사용자가 파일을 선택하고 업로드할 수 있도록 합니다:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>파일 업로드</title>
</head>
<body>
<h1>파일 업로드</h1>
<form action="/upload" method="POST" enctype="multipart/form-data">
<label for="file">파일 선택:</label>
<input type="file" name="file" id="file" required>
<button type="submit">업로드</button>
</form>
</body>
</html>
3. 파일 업로드 처리
Flask에서 파일 업로드를 처리하려면, request
객체의 files
속성을 사용합니다. 아래는 업로드를 처리하는 Flask 라우트입니다:
from werkzeug.utils import secure_filename
@app.route('/')
def index():
return render_template('upload.html')
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return "파일이 없습니다.", 400
file = request.files['file']
if file.filename == '':
return "파일 이름이 없습니다.", 400
# 안전한 파일 이름 사용
filename = secure_filename(file.filename)
# 파일 저장
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return f"{filename} 업로드 성공!"
4. 파일 업로드 후 확인
위 코드를 실행한 후 브라우저에서 애플리케이션을 실행하고 파일을 업로드하면 uploads/
디렉토리에 파일이 저장됩니다. 업로드된 파일이 성공적으로 저장되었는지 확인할 수 있습니다.
추가 기능 구현
파일 확장자 제한하기
특정 파일 확장자만 허용하려면 아래와 같은 유효성 검사를 추가할 수 있습니다:
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'txt', 'pdf'}
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return "파일이 없습니다.", 400
file = request.files['file']
if file.filename == '':
return "파일 이름이 없습니다.", 400
if not allowed_file(file.filename):
return "허용되지 않는 파일 형식입니다.", 400
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return f"{filename} 업로드 성공!"
업로드된 파일 목록 보기
업로드된 파일을 목록으로 보여주는 라우트를 추가할 수도 있습니다:
@app.route('/files')
def list_files():
files = os.listdir(app.config['UPLOAD_FOLDER'])
return render_template('file_list.html', files=files)
templates/file_list.html
파일 예제:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>업로드된 파일</title>
</head>
<body>
<h1>업로드된 파일</h1>
<ul>
{% for file in files %}
<li>{{ file }}</li>
{% endfor %}
</ul>
</body>
</html>
마무리
이번 포스팅에서는 Flask를 사용하여 파일 업로드 기능을 구현하는 방법을 알아보았습니다. Flask는 간단하지만 강력한 기능을 제공하여, 파일 업로드와 같은 작업도 쉽게 처리할 수 있습니다. 이제 여러분의 프로젝트에 파일 업로드 기능을 추가해 보세요!
'Python > Python Flask' 카테고리의 다른 글
Flask로 RESTful API 엔드포인트 만들기 (0) | 2025.09.08 |
---|---|
Flask RESTful API 기본 개념 (0) | 2025.09.07 |
Flask와 폼 처리 기법: 폼 유효성 검사 및 사용자 입력 처리 (0) | 2025.09.05 |
Flask와 폼 처리 기법: Flask-WTF 사용하기 (0) | 2025.09.04 |
Flask 데이터베이스 마이그레이션 관리 (0) | 2025.09.03 |