一、Flask-WTF 是什么?
Flask-WTF 是 Flask 的第三方表单扩展库,用于快速实现表单定义、数据校验、CSRF 安全防护、错误消息闪现,替代原生手动表单校验,大幅简化开发。Flask-WTF是基于 Flask 和 WTForms 的封装扩展,它让你可以更优雅地处理:HTML 表单生成、表单数据验证、CSRF 安全防护、文件上传处理。Flask-WTF:Flask + WTForms + 安全增强(CSRF)。https://flask.palletsprojects.com/zh-cn/stable/patterns/wtforms/
在纯 Flask 里,你通常要手动做:request.form 取值、手写验证逻辑(是否为空、长度、格式)、手动处理错误提示、手动防 CSRF,代码会很快变得混乱。Flask-WTF 帮你统一成“类 + 字段 + 规则”的方式。app.config['SECRET_KEY'] = 'your-secret-key'
<input type="hidden" name="csrf_token" value="...">
四、WTForms / Flask-WTF 常用字段(最新整理) | | |
|---|
| | <input type="text"> |
| | <textarea> |
| | <input type="password"> |
| | <input type="hidden"> |
| | <input type="submit"> |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | <select> |
| | <select multiple> |
| | |
| | |
| | |
| | |
| | |
| | |
pip install flask flask-wtf
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Length, EqualTo
class RegisterForm(FlaskForm): username = StringField("用户名", validators=[ DataRequired(message="用户名不能为空"), Length(min=3, max=16, message="用户名长度3-16位") ]) password = PasswordField("密码", validators=[ DataRequired(message="密码不能为空"), Length(min=6, message="密码至少6位") ]) password2 = PasswordField("确认密码", validators=[ DataRequired(message="请再次输入密码"), EqualTo("password", message="两次输入密码不一致") ]) submit = SubmitField("注册")
@bp.route('/register', methods=['GET', 'POST'])def register(): register_form = RegisterForm() # 1、判断请求方式 if request.method == 'POST': # 获取注册的用户名 username = register_form.username.data # 2、验证参数 if register_form.validate_on_submit(): flash(username + '注册成功','wtf_form') return redirect(url_for('auth.register')) else: flash('注册失败','wtf_form') return render_template('auth/register.html', form=register_form)
9.6、前端 register.html 模板wtf代码 <h1>用户注册:wtf方式</h1> <formmethod="post"> {{ form.csrf_token() }} <p> {{ form.username.label }}<br> {{ form.username(size=32) }} {% for err in form.username.errors %} <spanstyle="color:red">{{ err }}</span> {% endfor %} </p> <p> {{ form.password.label }}<br> {{ form.password(size=32) }} {% for err in form.password.errors %} <spanstyle="color:red">{{ err }}</span> {% endfor %} </p> <p> {{ form.password2.label }}<br> {{ form.password2(size=32) }} {% for err in form.password2.errors %} <spanstyle="color:red">{{ err }}</span> {% endfor %} </p> <p>{{ form.submit() }}</p> </form> <!-- 展示flash提示消息 --> {% for msg in get_flashed_messages(category_filter=['wtf_form']) %} <pstyle="color:green">{{ msg }}</p> {% endfor %}