11,flask之--WTForms
WTForms是什么?
相当于django的ModelForm。
在网页中,为了和用户进行信息交互总是不得不出现一些表单。flask设计了WTForm表单库来使flask可以更加简便地管理操作表单数据。WTForm中最重要的几个概念如下:
Form类,开发者自定义的表单必须继承自Form类或者其子类。Form类最主要的功能是通过其所包含的Field类提供对表单内数据的快捷访问方式。
各种Field类,即字段。一般而言每个Field类都对应一个input的HTML标签。比如WTForm自带的一些Field类比如BooleanField就对应<input type="checkbox">,SubmitField就对应<input type="submit">等等。
Validator类。这个类用于验证用户输入的数据的合法性。比如Length验证器可以用于验证输入数据的长度,FileAllowed验证上传文件的类型等等。
另外,flask为了防范csfr(cross-site request forgery)攻击,默认在使用flask-wtf之前要求app一定要设置过secret_key。最简单地可以通过app.config['SECRET_KEY'] = 'xxxx'来配置。app的配置涉及到如何架构整个项目目录,这里默认这个SECRET_KEY已经配置完成。
直接上代码:
后端代码:
from flask import Flask, render_template,request
from wtforms.fields import simple, core #用来创建组件
from wtforms import validators
from wtforms import Form #被继承 app = Flask(__name__) class LoginForm(Form):
username = simple.StringField(
label="用户名", # 标签标记
validators=[validators.DataRequired(message="用户名不能为空"),
validators.Length(min=,max=,message="不是长了就是短了")], # 校验条件 可迭代条件
# description='', # 描述标记
id="user_id", # 标签ID
default=None, # 默认值
widget=None, # 默认组件(input type="text") 在StringField中已经被实例化了
render_kw={"class":"my_login"}, # {"class":"my_login"}
)
password = simple.PasswordField(
label="密码", # 标签标记
validators=[validators.DataRequired(message="密码不能为空"),
validators.Length(min=, max=, message="不是长了就是短了"),
validators.Email(message="密码必须符合邮箱规则")], # 不知道
# description='', # 描述标记
id="user_id", # 标签ID
default=None, # 默认值
widget=None, # 默认组件(input type="text") 在PasswordField中已经被实例化了
render_kw={"class": "my_login"}, # {"class":"my_login"}
) class RegForm(Form):
username = simple.StringField(
label="用户名", # 标签标记
validators=[validators.DataRequired(message="用户名不能为空"),
validators.Length(min=,max=,message="用户名不是长了就是短了")], # 校验条件 可迭代条件
) password = simple.PasswordField(
label="密码", # 标签标记
validators=[validators.DataRequired(message="密码不能为空"),
validators.Length(min=, max=, message="密码不是长了就是短了"),
validators.Email(message="密码必须符合邮箱规则")],
) repassword = simple.PasswordField(
label="确认密码", # 标签标记
validators=[validators.EqualTo(fieldname="password",message="眼神未确认")]
) gender = core.RadioField(
label="性别",
coerce=str,
choices=(
("","女"),
("","男")
),
default=""
) hobby = core.SelectMultipleField(
label="爱好",
validators=[validators.Length(min=,max=,message="癖好有问题")],
coerce=int,
choices=(
(, "fengjie"),
(, "luoyufeng"),
(, "lixueqin"),
(, "wuyifan"),
(, "panta")
),
default=(,,)
) @app.route("/",methods=["GET","POST"])
def index():
if request.method == "GET":
fm = LoginForm()
return render_template("index.html",wtf = fm)
else:
new_fm = LoginForm(request.form)
if new_fm.validate():
return new_fm.data.get("password")
else:
return render_template("index.html", wtf=new_fm) @app.route("/reg",methods=["GET","POST"])
def reg():
if request.method == "GET":
rf = RegForm()
return render_template("reg.html",rf = rf)
else:
rf = RegForm(request.form)
if rf.validate():
print(type(rf.data.get("gender")),rf.data.get("gender"))
return rf.data.get("password")
else:
return render_template("reg.html", rf=rf) if __name__ == '__main__':
app.run(debug=True)
前端代码:index
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form action="" method="post" novalidate>
{{ wtf.username.label }}
{{ wtf.username }}
<p><h1>{{wtf.username.errors.}}</h1></p>
<p>
{{ wtf.password.label }}
{{ wtf.password }}
</p>
<p><h1>{{wtf.password.errors.}}</h1></p>
<input type="submit" value="登录">
</form>
</body>
</html>
前端代码reg
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form action="" method="post" novalidate>
{% for field in rf %}
<p>{{ field.label }}{{ field }}{{ field.errors. }}</p>
{% endfor %}
<input type="submit" value="注册">
</form>
</body>
</html>
访问效果:
11,flask之--WTForms的更多相关文章
- Flask插件wtforms、Flask文件上传和Echarts柱状图
一.wtforms 类比Django的Form组件Form组件的主要应用是帮助我们自动生成HTML代码和做一些表单数据的验证 flask的wtforms用法跟Form组件大同小异参考文章:https: ...
- 1.11 flask
2019-1-11 16:14:34 还有一天flask剩下的就是爬虫了! 越努力,越幸运!永远不要高估自己! 别人玩,你在默默努力!上帝不会亏待你的! Flask-SQLAlchemy参考连接 ht ...
- 85、flask之wtforms
本篇导航: wtforms组件的使用 自定义From组件 一.wtforms组件的使用 1.flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进 ...
- flask之wtforms
本篇导航: wtforms组件的使用 自定义From组件 一.wtforms组件的使用 1.flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进 ...
- Flask的WTforms
一.简单介绍 WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 类似于Django中的modelform 安装: pip3 install wtforms 二.简 ...
- Flask之wtforms源码分析
一.wtforms源码流程 1.实例化流程分析 # 源码流程 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: meta类读取到cls._ ...
- 【Flask】WTForms基本使用
# WTForms笔记:这个库一般有两个作用.第一个就是做表单验证,把用户提交上来的数据进行验证是否合法.第二个就是做模版渲染. ### 做表单验证:1. 自定义一个表单类,继承自wtforms.Fo ...
- flask flask_session,WTForms
一.Flask_session 本质上,就是是cookie 下的session存储在redis中,方便快速取得session from flask import Flask,session from ...
- 11.Flask钩子函数
在Flask中钩子函数是使用特定的装饰器的函数.为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码,那么这种函数就叫做钩子函数. before_first_requ ...
随机推荐
- 解析UML的面向对象分析与设计
经常听到有朋友抱怨,说学了UML不知该怎么用,或者画了UML却觉得没什么作用.其实,就UML本身来说,它只是一种交流工具,它作为一种标准化交流符号,在OOA&D过程中开发人员间甚至开发人员与客 ...
- 西门子触摸屏利用VBScript脚本创建csv文件
功能描述:利用VBScript脚本创建csv/txt文件 有时需要将PLC或运动控制器Simotion中的数据写到SD卡或U盘上.一种实现方法是,如果使用的是精致面板(comfort panel),可 ...
- graphql 项目搭建(二)
一.Express基本框架 1.新建一个文件夹gql-server vscode 打开项目,在终端下输入yarn init -y 生成package.json 包(如果没安装yarn ,npm也一样, ...
- java日期时间Date类
java.util包提供了Date类来封装当前的日期和时间. Date类提供两个构造函数来实例化Date对象. 第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函数接收一个参 ...
- Linux同步目录 保留文件修改时间和权限 rsync
scp copy文件夹的时候,会强行覆盖文件,导致增量同步的时候不方便,而rsync则能很好解决这个问题. rsync -avz ubuntu@192.168.1.208:/home/ubuntu/m ...
- spring-mabatis整合的配置文件
1.spring.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- [转载]Memcached缓存服务的简单安装
1.Linux下的安装方法 下载:wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x. ...
- Mysql limit 优化,百万至千万级快速分页,--复合索引的引用并应用于轻量级框架
MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始.有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻 ...
- ORB-SLAM使用方法
preparation:按照官網步驟完成ORB的安裝. 1.修改Camera calibration參數:到~/ORB_SLAM/Data/Settings.yaml修改 2.開啟終端機 -&g ...
- git中.gitignore 文件
现在项目的根目录放了 .gitignore 文件,并且git远程仓库的项目根目录已经有了 logs文件夹. 由于每次本地运行项目,都会生成新的log文件,但是我并不想提交logs文件夹里面的内容,所以 ...