前言:本文是学习网易微专业的《python全栈工程师 - Flask高级建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!
一、课程目标
- 表单数据接收
- 内置数据验证器
- 错误消息
- 自定义验证器
二、详情解读
2.1.表单数据接收
2.1.1.数据接收
通过form
表单提交的数据可以使用form.data
接收
form = LoginForm()
username = form.data['username']
form.data
会对表单提交的数据进行验证,数据转换
如果有一个表单字段是Integer
类型,比如score
,那么:
score = form.data['score']
相当于:
if "score" in request.form:
score = int(request.form['score'])
else:
score = 0
实操:
step
:修改app.py
文件中的login()
视图函数:
.
.
.
@app.route('/login', methods=['get', 'post'])
def login():
# 新增
form = LoginForm()
message = None
if request.method == "POST":
# 用户名和密码的数据接收用下面这两行代替
username = form.data['username']
password = form.data['password']
user = User.query.filter_by(username=username).first()
if user and user.validate_password(password):
session['user'] = user.username
# 登录成功返回首页
return redirect(url_for("index"))
else:
message = "用户名与密码不匹配"
return render_template("login.html", message = message,
form=form
)
.
.
.
2.2.数据验证器
2.2.1.数据验证的必要性
为什么要进行验证?
1.用户填写的时候不了解数据要求
2.别有用心的用户不择手段危害网站
验证手段:
1.前端验证,改进用户体验
2.后端验证,提升网站安全性
由于前端的任何验证都可以被忽略,所以永远不要相信前端提交来的数据是安全的。
2.2.2.flask-wtf提供的数据验证
验证器 | 说明 |
---|---|
InputRequire(message) | 必填字段 |
Length(min, max, message) | 输入长度范围 |
NumberRange(min, max, message) | 输入数值范围 |
Regexp(regex, flags, message) | 正则表达式验证 |
Url(message) | 输入字符串为合法的网址结构 |
Email(message) | 输入必须为邮件地址 |
EqualTo(fieldname, message) | 必须与fieldname的值一致 |
DateRequired(message) | 输入有效性 |
FileRequired(message) | 必须是文件 |
AnyOf(values, message) | 输入值必须在values列表中 |
NoneOf(values, message) | 输入值不在values列表中 |
实操:
修改forms/account_form.py
文件中的LoginForm()
为以下代码:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, SelectMultipleField, \
widgets, RadioField, TextAreaField,SelectField
from flask_ckeditor import CKEditorField
# 引入DataRequired模块
from wtforms.validators import DataRequired
class LoginForm(FlaskForm):
# 用户名和密码新增validtors验证器
username = StringField('用户名',
validators=[DataRequired(message="必须填写用户名")],
render_kw={
"class": "form-control", "placeholder": "输入用户名"})
password = PasswordField('密码',
validators=[DataRequired(message="必须填写密码")],
render_kw={
"class": "form-control", "placeholder": "输入密码"})
# 多选框选项
choices = [(1, "一周免登录"), (2, "二周免登录"), (3, "三周免登录")]
remember = CheckBoxField('记忆方式', choices=choices)
sex_choices = [(1, '女'), (2, '男')]
sex = RadioField('性别', choices=sex_choices)
# 这里第一个参数为空,因为登录按钮不用显示label的值
submit = SubmitField('', render_kw