网站首页 > 技术文章 正文
学习照猫画虎,是一种享受,实际上学习的痛苦是短暂的,没去学的痛苦是长期的。以后会有很多瞬间,因为你自己不会,而错失了良机~
1、配置
Flask-WTF 可以把处理Web表单的过程变成一种愉快的体验,首先是安装~
ailx10
10w+ 次咨询
网络安全优秀回答者
网络安全硕士
去咨询
然后是配置一个应用密钥,越复杂越好,这是为了防止CSRF跨站脚本伪造,Flask-WTF为所有表单生成安全令牌,存储在用户会话中~
2、表单类
每个表单都由一个继承 FlaskForm 的类表示,这个类定义表单中的一组字段,每个字段都是一个对象,字段对象可以附属多个验证函数,用于验证用户提交的数据是否有效~
- NameForm 是一个大表单
- name 是StringField类对象,表示type="text"的<input>元素
- submit 是SubmitField类对象,表示type="submit"的<input>元素
- 对象的第一个参数会渲染成 label
字段类型 | 说明 |
BooleanField | 复选框,值为True或False |
DateField | 文本字段,值为datetime.date格式 |
DateTimeField | 文本字段,值为datetime.datetime格式 |
DecimalField | 文本字段,值为decimal.Decimal |
FileField | 文件上传字段 |
HiddenField | 隐藏的文本字段 |
MultipleFileField | 多文件创段字段 |
FieldList | 一组指定类型的字段 |
FloatField | 文本字段,值为浮点型 |
FormField | 把一个表单作为字段,嵌入另一个表单 |
IntegerField | 文本字段,值为整数 |
PasswordField | 密码文本字段 |
RadioField | 一组单选按钮 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表,值可以多选 |
SubmitField | 表单提交按钮 |
StringField | 文本字段 |
TextAreaField | 多行文本字段 |
常见的wtf 表单验证函数
验证函数 | 说明 |
DataRequired | 确保转换类型后字段中有数据 |
验证电子邮件 | |
EqualTo | 比较两个字段的值 |
InputRequired | 确保转换类型前字段中有数据 |
IPAddress | 验证IPv4网络地址 |
Length | 验证输入字符串的长度 |
MacAddress | 验证MAC地址 |
NumberRange | 验证输入的值在数字范围之内 |
Optional | 允许字段中没有输入 |
Regexp | 使用正则表达式验证输入值 |
URL | 验证URL |
UUID | 验证UUID |
AnyOf | 验证输入值在一组可能的值中 |
NoneOf | 确保输入值不在一组可能的值中 |
3、把表单渲染成HTML
可以使用Bootstrap预定义的表单样式渲染整个Flask-WTF表单,只需要2句话就可以了,wtf.quick_form() 函数的参数是Flask-WTF表单对象,使用Bootstrap的默认样式渲染传入的表单~
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
4、在视图中处理表单
- 直接请求,没有提交表单,是GET请求
- 提交表单,就是POST请求
- form参数和name参数,都会进入index.html进行渲染
@app.route("/",methods=["GET","POST"])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ""
return render_template("index.html",form=form,name=name)
输入ailx10,然后提交表单,渲染效果如下:
5、重定向和用户会话
当我们刷新页面的时候,页面会弹出来一个对话框,这是因为我们是POST提交的表单,页面刷新会再次提交表单,但是这并不是我们期望的~
于是就有了重定向了,我们最好让Web应用以GET方式结尾,这样怎么刷新都没问题~
- redirect(url_for("index")) 重定向到一个新的URL
- name=session.get("name") 如果没有GET到内容,返回None
@app.route("/",methods=["GET","POST"])
def index():
form = NameForm()
if form.validate_on_submit():
session["name"] = form.name.data
return redirect(url_for("index"))
return render_template("index.html",form=form,name=session.get("name"))
6、闪现消息
请求完成后,有时需要让用户感知状态发送了变化,Flask内置了这个功能~
flash函数可以实现这个效果,如果你第一次和第二次输入的名字不一样,那么会出现一个提醒:“你改名字啦~“
{% block content %}
<div class="container">
{% for message in get_flashed_messages() %}
<div class="alert alert-warning">
<button type="button" class="close" data-dismiss="alert">×</button>
{{ message }}
</div>
{% endfor %}
{% block page_content %}{% endblock %}
</div>
{% endblock %}
@app.route("/",methods=["GET","POST"])
def index():
form = NameForm()
if form.validate_on_submit():
old_name = session.get("name")
if old_name is not None and old_name != form.name.data:
flash("你改名字啦~")
session["name"] = form.name.data
return redirect(url_for("index"))
return render_template("index.html",form=form,name=session.get("name"))
本篇完,谢谢大家~
发布于 2021-01-12 23:08 (知乎)
猜你喜欢
- 2024-10-15 如何在Flask应用程序中使用JSON Web Tokens进行安全认证
- 2024-10-15 综合指南:将 Flask 与 MongoDB 结合使用
- 2024-10-15 python-flask搭建平台,HTML+CSS+JS写前端的web全栈-动画轮播
- 2024-10-15 Flask 表单处理(flask formdata)
- 2024-10-15 三、flask博客项目实战-之表单(flask 表单)
- 2024-10-15 flask python web开发的简单易学框架
- 2024-10-15 Flask-APScheduler使用教程(flask apscheduler)
- 2024-10-15 flask 项目中使用 bootstrapFileInput(进阶篇)
- 2024-10-15 基于flask框架展示数据可视化的一次尝试
- 2024-10-15 iOS 17.3已修复,“快捷指令”高危漏洞被披露:可发送敏感数据
- 最近发表
-
- 如何在 Linux 上安装 Java_怎么在linux中安装jdk
- Linux中tar命令打包路径相关问题_linux怎么用tar打包一个目录
- 常用linux系统常用扫描命令汇总_常用linux系统常用扫描命令汇总表
- VM下linux虚拟机新建过程(有图)_linux虚拟机创建新用户命令
- 系统小技巧:迁移通过Wubi方式安装的Ubuntu系统
- 文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
- 如何利用ftrace精确跟踪特定进程调度信息
- prometheus网络监控之fping-exporter
- hyper linux的实操步骤,hyper-v批量管理工具的使用指南
- 2021年,运维工程师笔试真题(二)(附带答案)
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)