Flask使用Flask-WTF表单

默认请求下,Flask-WTF能保护所有表单免受跨站请求伪造(CSRF)的攻击。为了实现CSRF保护,Flask-WTF需要程序设置一个密钥。Flask-WTF使用这个密钥生成加密令牌,再用令牌验证请求中表单数据的真伪。设置密钥的语句如下:

secret_key内容可以自行定义,可以随便写一个值

app.secret_key = “secret from”

创建表单类

使用Flask-WTF时,每个Web表单都由一个继承自Form的类表示。这个类定义表单中的一组字段,每个字段都用对象表示。字段对象可附属一个或多个验证函数。验证函数用来验证用户提交的输入值是否符合要求。

如下创建一个简单的Web表单。

from flask_wtf import FlaskForm

from wtforms import StringField, PasswordField, SubmitField

from wtforms import validators

定义一个表单类

class LoginForm(FlaskForm):

定义一个文本框,提示信息为用户名,validators设置验证规则,参数是一个列表,可以添加多个验证函数,DataRequired不能为空验证函数

username = StringField(“用户名:”, validators=[validators.DataRequired()])

定义一个密码框

password = PasswordField(“密码:”, validators=[validators.DataRequired()])

定义一个提交按钮

submit = SubmitField(“提交”)

定义了一个登录的form表单,其中有输入用户名和密码的文本框和一个表单提交按钮。除了上面定义的字段和验证规则外,还有一些常用的字段和验证规则,如下表。

WTForms支持的HTML字段

| 字段类型 | 说明 |

| — | — |

| StringField | 文本字段 |

| TextAreaField | 多行文本字段 |

| PasswordField | 密码文本字段 |

| HiddenField | 隐藏文本字段 |

| DateField | 文本字段,值为datetime.date格式 |

| DateTimeField | 文本字段,值为datetime.datetime格式 |

| IntegerField | 文本字段,值为整数 |

| DecimalField | 文本字段,值为decimal.Decimal |

| FloatField | 文本字段,值为浮点数 |

| BooleanField | 复选框,值为True和False |

| RadioField | 一组单选框 |

| SelectField | 下拉列表 |

| SelectMultipleField | 下拉列表,可选择多个值 |

| FileField | 文件上传字段 |

| SubmitField | 表单提交按钮 |

| FormField | 把表单作为字段嵌入另一个表单 |

| FieldList | 一组指定类型的字段 |

WTForms验证函数

| 验证函数 | 说明 |

| — | — |

| Email | 验证电子邮件地址 |

| EqualTo | 比较两个字段的值;常用于要求输入两次密码进行确认的情况 |

| IPAddress | 验证IPv4网络地址 |

| Length | 验证输入字符串的长度 |

| NumberRange | 验证输入的值在数字返回内 |

| Optional | 无输入值时跳过其他验证函数 |

| DataRequired | 确保字段中有数据 |

| Regexp | 使用正则表达式验证输入值 |

| URL | 验证URL |

| AnyOf | 确保输入值在可选值列表中 |

| NoneOf | 确保输入值不值可选值列表中 |

定义视图函数

定义一个视图函数,请求方式设置为GET和POST请求,请求跳转到表单页面,POST请求为表单提交请求,如果是PSOT请求,则输出接收到表单传递过来的内容。代码如下:

@app.route(‘/login’, methods=[‘GET’, ‘POST’])

def login():

form = LoginForm()

if request.method == ‘POST’:

获取form表单提交过来的值

username = form.username.data

pwd = form.password.data

print(username, pwd, sep=‘====’)

return render_template(“login.html”, form=form)

把表单类当做参数传递到表单页面。

渲染表单

把表单渲染为HTML文件,代码如下:

### 使用 Flask-WTF 进行表单验证 在 Flask 中,`Flask-WTF` 库提供了强大的工具来简化 Web 表单的创建和验证过程。为了实现有效的表单验证,开发者通常会遵循一系列特定的方法。 #### 创建表单使用 `Flask-WTF` 时,每个 Web 表单都由一个继承自 `Form` 的类表示[^4]。此表单类定义了一组字段,这些字段作为对象存在,并且可以附加一个或多个验证函数以确保用户输入的有效性。 ```python from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, Email, EqualTo, ValidationError from models import User class RegistrationForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()]) confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')]) submit = SubmitField('Sign Up') def validate_email(self, field): if User.query.filter_by(email=field.data).first(): raise ValidationError('该邮箱已被注册') ``` 上述代码展示了如何定义一个简单的注册表单并为其添加基本验证逻辑。对于更复杂的场景,则可以通过重写 `validate_<fieldname>` 方法来自定义额外的验证规则[^5]。 #### 实现 CSRF 保护 除了提供便捷的方式构建表单外,`Flask-WTF` 还自动集成了跨站点请求伪造 (CSRF) 攻击防护机制[^2]。这意味着只要正确配置了应用实例,在每次提交 POST 请求之前都会检查是否存在合法的令牌,从而提高了应用程序的安全性。 #### 处理表单提交 当接收到用户的 HTTP POST 请求后,可以在视图函数内部轻松地处理已填充好的表单实例: ```python @app.route("/register", methods=['GET', 'POST']) def register(): form = RegistrationForm() if form.validate_on_submit(): flash(f'Account created for {form.username.data}!', 'success') return redirect(url_for('home')) return render_template('register.html', title='Register', form=form) ``` 这段代码片段说明了如何接收客户端发送过来的数据并通过调用 `validate_on_submit()` 来触发所有预设以及任何自定义的验证器。如果一切顺利,则继续执行后续操作;反之则返回带有错误提示信息的页面供用户修正其输入内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值