[파이썬] Flask-WTF 확장 사용

Flask-WTF는 Flask 웹 프레임워크에서 폼을 쉽게 생성하고 유효성 검사를 처리하는 데 도움을 주는 확장입니다. 이 확장을 사용하면 HTML 폼을 생성하고 사용자로부터의 입력을 쉽게 처리할 수 있게 됩니다. 이번 블로그 포스트에서는 Flask-WTF 확장의 기본적인 사용법을 알아보겠습니다.

Flask-WTF 설치

Flask-WTF를 사용하기 위해서는 먼저 Flask와 WTForms도 설치해야 합니다. 다음 명령을 사용하여 Flask-WTF를 설치하세요:

$ pip install Flask-WTF

폼 클래스 생성

Flask-WTF를 사용하여 폼을 생성하려면 먼저 폼 클래스를 정의해야 합니다. 폼 클래스는 WTForms의 Form 클래스를 상속받는 파이썬 클래스입니다. 예를 들어, 사용자로부터 이름과 이메일 주소를 입력 받는 폼을 생성하려면 다음과 같이 폼 클래스를 정의할 수 있습니다:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Email

class MyForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    submit = SubmitField('Submit')

위의 코드에서 StringFieldSubmitField는 입력 필드와 폼 전송 버튼을 생성하는데 사용되는 WTForms의 클래스입니다. validators 매개변수를 통해 각 필드의 유효성 검사 규칙을 지정할 수 있습니다.

라우트 함수

폼을 생성했다면, 해당 폼을 사용할 라우트 함수를 작성해야 합니다. Flask-WTF를 사용하면 간단한 데코레이터를 이용하여 CSRF 보호와 같은 폼 처리를 손쉽게 할 수 있습니다. 다음은 예시입니다:

from flask import Flask, render_template
from flask_wtf import CSRFProtect

app = Flask(__name__)

# CSRF 보호를 위해 활성화
csrf = CSRFProtect(app)

@app.route('/', methods=['GET', 'POST'])
def index():
    form = MyForm()
    
    if form.validate_on_submit():
        # 폼이 제출되고 유효할 경우 처리하는 로직 작성
        name = form.name.data
        email = form.email.data
        
        # 처리 로직 추가...
        
        return "Success"
    
    return render_template('index.html', form=form)

위의 코드에서 validate_on_submit() 메소드를 사용하여 폼이 제출되었고 유효한지 검사합니다. 폼이 유효한 경우 해당 폼 필드의 데이터를 얻을 수 있습니다. 이후 해당 데이터로 처리 로직을 추가하면 됩니다.

템플릿 파일

마지막으로, 폼을 표시할 HTML 템플릿 파일을 작성해야 합니다. 템플릿 파일에서는 WTForms의 form 객체에서 필드를 생성하고 렌더링할 수 있습니다. 예를 들어, index.html 템플릿 파일은 다음과 같이 작성할 수 있습니다:


<!DOCTYPE html>
<html>
<head>
    <title>Flask-WTF Example</title>
</head>
<body>
    <h1>Flask-WTF Example</h1>
    <form method="POST">
        {{ form.csrf_token }}
        
        {{ form.name.label }} {{ form.name() }}
        {% if form.name.errors %}
            <ul>
                {% for error in form.name.errors %}
                    <li style="color: red;">{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
        
        {{ form.email.label }} {{ form.email() }}
        {% if form.email.errors %}
            <ul>
                {% for error in form.email.errors %}
                    <li style="color: red;">{{ error }}</li>
                {% endfor %}
            </ul>
        {% endif %}
        
        {{ form.submit() }}
    </form>
</body>
</html>

위의 코드에서 {{ form.csrf_token }}은 CSRF 토큰 필드를 생성하는데 사용되며, 나머지 필드는 {{ 필드명.label }} {{ 필드명() }} 형식으로 렌더링합니다. 또한 각 필드에 대한 유효성 검사 오류 메시지를 출력하기 위해 if 조건문을 사용합니다.

이제 Flask 웹 애플리케이션에서 Flask-WTF 확장을 사용하여 폼을 생성하고 처리할 수 있는 기본적인 내용을 알아보았습니다. Flask-WTF은 다양한 폼 필드 및 유효성 검사 규칙을 지원하므로, 필요에 맞게 활용하여 웹 애플리케이션을 개발할 수 있습니다.

더 자세한 내용은 Flask-WTF 공식 문서를 참조하세요.