在 Flask 中,WTForms
是一個用于 處理表單驗證 的庫,可以與 Flask 結合,提供表單驗證、數據清理、錯誤提示等功能。
1. 安裝 Flask-WTF
首先安裝 Flask-WTF
:
pip install Flask-WTF
Flask-WTF
是 WTForms
的 Flask 擴展,提供了 CSRF 保護 和 Flask 兼容的表單處理。
2. 基本使用
(1) 創建 Flask 應用
from flask import Flask, render_template, request, redirect, flash
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, Email, EqualToapp = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key' # 必須設置,否則 CSRF 保護無法使用
(2) 定義表單
使用 FlaskForm
繼承 WTForms
,定義表單字段和驗證規則:
class LoginForm(FlaskForm):email = StringField('郵箱', validators=[DataRequired(), Email()])password = PasswordField('密碼', validators=[DataRequired(), Length(min=6, max=12)])submit = SubmitField('登錄')
? DataRequired()
不能為空
? Email()
必須是合法郵箱格式
? Length(min=6, max=12)
密碼長度 6-12 位
(3) 創建視圖
表單處理邏輯
@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit(): # 檢查表單是否有效email = form.email.datapassword = form.password.dataflash(f'用戶 {email} 登錄成功', 'success')return redirect('/success') # 登錄成功跳轉return render_template('login.html', form=form)
? form.validate_on_submit()
自動檢查 POST 數據是否符合驗證規則
? flash()
用于在前端顯示錯誤或成功信息
? form.email.data
獲取表單數據
(4) 編寫 HTML 表單
templates/login.html
:
<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>登錄</title>
</head>
<body><h1>登錄</h1>{% with messages = get_flashed_messages(with_categories=true) %}{% if messages %}{% for category, message in messages %}<p style="color: {{ 'green' if category == 'success' else 'red' }}">{{ message }}</p>{% endfor %}{% endif %}{% endwith %}<form method="POST">{{ form.hidden_tag() }} {# CSRF 保護 #}<p>{{ form.email.label }} <br>{{ form.email(size=30) }} <br>{% for error in form.email.errors %}<span style="color:red;">{{ error }}</span>{% endfor %}</p><p>{{ form.password.label }} <br>{{ form.password(size=30) }} <br>{% for error in form.password.errors %}<span style="color:red;">{{ error }}</span>{% endfor %}</p><p>{{ form.submit() }}</p></form>
</body>
</html>
? {{ form.hidden_tag() }}
用于 CSRF 保護
? form.email(size=30)
渲染表單輸入框
? for error in form.email.errors
顯示驗證錯誤
3. 復雜表單示例(注冊表單)
支持 兩次密碼一致性驗證:
class RegisterForm(FlaskForm):username = StringField('用戶名', validators=[DataRequired(), Length(min=3, max=20)])email = StringField('郵箱', validators=[DataRequired(), Email()])password = PasswordField('密碼', validators=[DataRequired(), Length(min=6, max=12)])confirm_password = PasswordField('確認密碼', validators=[DataRequired(), EqualTo('password', message="兩次密碼不一致")])submit = SubmitField('注冊')
? EqualTo('password')
驗證兩次密碼一致
? message="兩次密碼不一致"
自定義錯誤提示
注冊視圖:
@app.route('/register', methods=['GET', 'POST'])
def register():form = RegisterForm()if form.validate_on_submit():flash(f'用戶 {form.username.data} 注冊成功', 'success')return redirect('/login')return render_template('register.html', form=form)
4. 自定義驗證器
可以自定義表單驗證邏輯。例如:檢查用戶名是否已存在。
from wtforms.validators import ValidationErrorclass UniqueUsername:"""自定義驗證器,檢查用戶名是否已被使用"""def __init__(self, message=None):if not message:message = "該用戶名已被占用"self.message = messagedef __call__(self, form, field):existing_users = ["admin", "test"] # 假設數據庫已有的用戶名if field.data in existing_users:raise ValidationError(self.message)class RegisterForm(FlaskForm):username = StringField('用戶名', validators=[DataRequired(), Length(min=3, max=20), UniqueUsername()])email = StringField('郵箱', validators=[DataRequired(), Email()])password = PasswordField('密碼', validators=[DataRequired(), Length(min=6, max=12)])confirm_password = PasswordField('確認密碼', validators=[DataRequired(), EqualTo('password')])submit = SubmitField('注冊')
? UniqueUsername()
檢查用戶名是否已注冊
? raise ValidationError(self.message)
觸發錯誤
5. 結論
Flask-WTF
是WTForms
的 Flask 擴展,提供 表單驗證、CSRF 保護。FlaskForm
定義表單字段 & 驗證規則,如DataRequired()
、Email()
。form.validate_on_submit()
自動檢查表單數據。- HTML 使用
form.hidden_tag()
保護 CSRF,用form.errors
顯示錯誤。 - 支持自定義驗證器,如檢查用戶名是否唯一。
Flask + WTForms 讓表單驗證更安全、更易用!🚀