Python/Python Flask

Flask에서 폼 처리와 파일 업로드 기능 구현하기

임베디드 친구 2025. 9. 6. 20:56
728x90
반응형

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는 간단하지만 강력한 기능을 제공하여, 파일 업로드와 같은 작업도 쉽게 처리할 수 있습니다. 이제 여러분의 프로젝트에 파일 업로드 기능을 추가해 보세요!

반응형