Flask学习日志(三)
今天学习新的内容了
Flask学习日志-表单
1、Web表单
1.1 简单了解
Q1:什么是Web表单?
- 一个web应用程序的基础功能
- HTML页面中负责数据采集的部件
Q2:表单有哪些组成部分?
- 表单标签
- 表单域
- 表单按钮
Q3:表单干了什么工作?
- 允许用户输入数据
- 负责HTML页面数据采集
- 将用户的数据提交给服务器
1.2 普通表单实现与验证
就以看房子为例,现在我房子用的是密码锁,进房子之前需要填写信息,先说一下逻辑:
- 首先路由需要两种请求方式,get和post,我们要从页面输入参数就需要用post,而从表单中获取参数就要用get
- 获取请求的参数
- 就是判断逻辑了,看你有没有填写完整密码,或者密码错误
- 对于不同的问题,作出相应的回应
这里我们先写一个表单,里面有户主名和房间密码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Form</title>
</head>
<body>
<form method="post">
<label>户主名:</label><input type="text" name="username"><br>
<label>房间密码:</label><input type="password" name="password"><br>
<label>确认密码:</label><input type="password" name="password2"><br>
<input type="submit" value="确认"><br>
</form>
</body>
</html>
效果如下:
具体实现代码如下:
这里要获取请求数据就要用到request
@app.route('/',methods=['GET','POST'])
def form():
#request 是一个请求对象 可以获取请求方式、数据
if request.method=='POST':
#获取请求参数
username=request.form.get('username')
pwd = request.form.get('password')
pwd2 = request.form.get('password2')
#验证逻辑
if not all([username,pwd,pwd2]):
print("Incomplete data!")
elif pwd!=pwd2:
print('Password error!')
else:
return username+'! Welcome home!'
return render_template('userform.html')
if __name__=='__main__':
app.run(debug=True)
1.3 flash消息闪现
在之前我们对于表单数据问题的回应是在控制台显示的,现在我们要让它在网页上显示,所以我们要用flash动态显示。
- 只需要把print改为flash即可。
if not all([username,pwd,pwd2]):
flash("Incomplete data!")
elif pwd!=pwd2:
flash('Password error!')
同时要注意在使用flash时要加密消息,要设置好secret_key
app.secret_key='Ethan312'
然后呢,我们在模板里遍历一下flash消息列表,get_flashed_messages()返回的是一个列表
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
来看看效果吧!
现在,消息直接在网页上显示了
2、WTF扩展
2.1 WTF简单了解
在Flask中,为了处理web表单,一般使用Flask-WTF扩展,它封装了WTForms,并且有验证表单数据的功能。
我们用它来验证表单,它有许多验证函数,具体可以看它的flask_WTF阅读文档
先来看一下WTForms支持的HTML标准字段:
字段对象 | 说明 |
---|---|
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
PasswordField | 密码文本字段 |
HiddenField | 隐藏文件字段 |
DateField | 文本字段,值为datetime.date文本格式 |
DateTimeField | 文本字段,值为datetime.datetime 文本格式 |
IntegerField | 文本字段,值为整数 |
DecimalField | 文本字段,值为decimal.Decimal |
FloatField | 文本字段,值为浮点数 |
BooleanField | 复选框,值为True 和False |
RadioField | 一组单选框 |
SelectField | 下拉列表 |
SelectMutipleField | 下拉列表,多选 |
FileField | 文件上传字段 |
SubmitField | 表单提交按钮 |
FormField | 把表单作为字段嵌入另一个表单 |
FieldList | 一组指定类型的字段 |
WTForms常用验证函数
验证函数 | 说明 |
---|---|
DataRequired | 确保字段中有数据 |
EqualTo | 比较两个字段的值,常用于比较两次密码输入 |
Length | 验证输入字符串长度 |
NumberRange | 验证输入的值在数字范围内 |
URL | 验证URL |
AnyOf | 验证输入值在可选列表内 |
NoneOf | 验证输入值不在可选列表内 |
2.2 WTF表单显示
- 在py文件中自定义一个表单类,继承自FlaskForm
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
class UserForm(FlaskForm):
username=StringField('户主名:')
password = PasswordField('房间密码:')
password2 = PasswordField('确认密码:')
submit = SubmitField('确认')
- 在视图函数中创建一个表单类对象,并将对象传入
@app.route('/form',methods=['GET','POST'])
def login_form():
user_form=UserForm()
return render_template('userform.html',form=user_form)
- 在HTML页面直接写form表单
<form method="post">
<h3>WTF表单显示</h3>
{{ form.username.label}}{{ form.username }}<br>
{{ form.password.label}}{{form.password }}<br>
{{ form.password2.label}}{{form.password2 }}<br>
{{ form.submit }}
</form>
效果如下:
2.3 WTF表单验证
- 导入需要的验证函数
from wtforms.validators import DataRequired,EqualTo
- 给表单类的函数中传入验证函数
username=StringField('户主名:',validators=[DataRequired()])
password = PasswordField('房间密码:', validators=[DataRequired()])
password2 = PasswordField('确认密码:', validators=[DataRequired(),EqualTo('password','Password error!')])
submit = SubmitField('确认')
validators可以传入多个参数,这里EqualTo()函数中,传入的第一个参数是你要对比的值,第二个是message,就是当密码不一样时,会提示消息message。
- 判断请求方式,并获取参数
if request.method=='POST':
#获取请求参数
username=request.form.get('username')
pwd = request.form.get('password')
pwd2 = request.form.get('password2')
- 验证参数
if user_form.validate_on_submit():
return username+'! Welcome home!'
else:
flash('Data error!')
效果如下:
Case1:空白字符
Case2:密码不一致
Case3:信息一致
??? 怎么回事?
先调试一下
error:The CSRF token is missing.
什么是CSRF?
使用Flask-WTF需要设置参数SECRET_KEY
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。SECRET_KEY用来生成加密令牌,当CSRF**,该设置会根据设置的**生成加密令牌。
如何解决呢?
只要在HTML页面的form表单里添加这句就可以了
{{ form.csrf_token() }}
现在来试一下
成功了!终于可以进房子了!
3、总结
一句话 !今天主要是学习了web表单的显示与验证!
一种:普通的显示与验证
另一种:WTF扩展
推荐阅读
-
深度学习(三)--简单应用
-
(三)Tensorflow学习——mnist数据集简介
-
Liferay Portal学习笔记(三):自定义页面布局Template 博客分类: Liferay学习 EXTXMLTomcatCMSHTML
-
征服flume之三——使用log4j输出日志到flume 博客分类: 企业架构 flumelog4javrosink
-
征服flume之三——使用log4j输出日志到flume 博客分类: 企业架构 flumelog4javrosink
-
jQuery 学习笔记(三)
-
IO流学习(Java)(三)
-
jQuery学习三 操作属性和CSS
-
matter.js学习笔记(三)--mouseConstraint鼠标控制
-
JavaScript深入浅出学习笔记(三)—语句 博客分类: JavaScript javaScript语句