Category/Flask

flask-wtf란?

Corinee 2024. 9. 19. 23:13
728x90

Flask-WTF는 Flask 웹 애플리케이션에서 웹 폼 처리를 간편하게 할 수 있도록 돕는 확장 패키지입니다. Flask-WTF는 WTForms 라이브러리와 Flask를 통합하여 폼 생성, 폼 검증, 그리고 보안 기능(예: CSRF 보호)을 쉽게 관리할 수 있게 해줍니다.

주요 기능:

  1. 폼 생성 및 관리: Flask-WTF는 WTForms를 기반으로 하여 다양한 HTML 폼 요소(텍스트 입력, 비밀번호 입력, 체크박스 등)를 Python 클래스와 필드로 쉽게 정의할 수 있게 해줍니다.
  2. 폼 검증: 사용자로부터 입력된 데이터를 쉽게 검증할 수 있도록 여러 유효성 검사기(validator)를 제공합니다. 예를 들어, 필수 입력값, 이메일 형식, 최소/최대 글자 수 등을 쉽게 설정할 수 있습니다.
  3. CSRF 보호: Flask-WTF는 CSRF (Cross-Site Request Forgery) 공격을 방지하는 기능을 기본 제공하여, 폼을 사용할 때 자동으로 보안 토큰을 생성하고 검증합니다.
  4. 폼 렌더링: Flask-WTF는 WTForms의 기능을 확장하여 Flask의 템플릿 엔진(Jinja2)과 쉽게 통합되어, HTML 템플릿에서 폼을 쉽게 렌더링하고 처리할 수 있습니다.

Flask-WTF 사용 예시:

1. 폼 클래스 정의:

from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequired, Length

class QuestionForm(FlaskForm):
    subject = StringField('제목', validators=[DataRequired(), Length(min=1, max=200)])
    content = TextAreaField('내용', validators=[DataRequired()])
    submit = SubmitField('제출')

여기서는 FlaskForm을 상속받은 폼 클래스를 정의합니다. subject 필드와 content 필드가 있고, 각 필드에 유효성 검사를 추가할 수 있습니다. 예를 들어, DataRequired()는 필수 입력값을 요구하고, Length()는 입력 문자열의 길이를 제한합니다.

2. 폼을 템플릿에서 사용하기:

<form method="POST" action="">
    {{ form.hidden_tag() }}  <!-- CSRF 보호를 위한 숨겨진 태그 -->
    
    <div>
        {{ form.subject.label }}  <!-- 필드 라벨 -->
        {{ form.subject(size=50) }}  <!-- 폼 필드 -->
        {% if form.subject.errors %}
            <ul>
            {% for error in form.subject.errors %}
                <li>{{ error }}</li>
            {% endfor %}
            </ul>
        {% endif %}
    </div>
    
    <div>
        {{ form.content.label }}
        {{ form.content(rows=10) }}
        {% if form.content.errors %}
            <ul>
            {% for error in form.content.errors %}
                <li>{{ error }}</li>
            {% endfor %}
            </ul>
        {% endif %}
    </div>

    <div>
        {{ form.submit() }}  <!-- 제출 버튼 -->
    </div>
</form>

이 코드는 Flask 템플릿에서 폼을 렌더링하는 방법을 보여줍니다. 각 필드와 유효성 검사 오류를 처리하는 부분을 포함하여 쉽게 폼을 관리할 수 있습니다.

3. CSRF 보호:

Flask-WTF는 기본적으로 CSRF 보호를 위해 폼에 CSRF 토큰을 포함시키며, 이를 통해 폼이 외부에서 조작되는 것을 방지할 수 있습니다.

4. 폼 데이터를 처리하기:

from flask import Flask, render_template, redirect, url_for, flash
from forms import QuestionForm  # 폼 클래스

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # CSRF 보호를 위해 필요

@app.route('/submit', methods=['GET', 'POST'])
def submit():
    form = QuestionForm()
    if form.validate_on_submit():
        # 폼 데이터 처리 (예: DB에 저장)
        flash('질문이 성공적으로 제출되었습니다.')
        return redirect(url_for('index'))
    return render_template('submit.html', form=form)

위 코드는 폼을 처리하는 기본적인 방식입니다. validate_on_submit()는 폼이 제출되었는지와 유효성 검사를 통과했는지를 확인합니다.

결론:

Flask-WTF는 Flask 애플리케이션에서 웹 폼을 쉽게 처리하고 보안성을 높이는 데 필수적인 도구입니다. 폼 생성, 검증, CSRF 보호를 단순화하여 개발자의 작업을 크게 줄여줍니다.

728x90