一、简单介绍

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

类似于Django中的modelform

安装:

pip3 install wtforms

二、简单使用

后端代码app.py

from flask import Flask, request, render_template, session
from flask_session import Session
from redis import Redis
from wtforms import Form, validators, widgets
from wtforms.fields import simple, core app = Flask(__name__)
app.config["DEBUG"] = True
# 用原生的session要设置SECRET_KEY
# app.config["SECRET_KEY"] = 'uihuiwuiwoiw' # 使用redis session
app.config["SESSION_TYPE"] = "redis"
# 实例化redis
app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379) # redis 不要放在公网 # 设置存在客户端的cookies中的session的名字
# app.config["SESSION_COOKIE_NAME"] = "#¥%……&*(#E$RTY$%RTY%^Y&U%^&*" # 用第三方session替换原生的session;这是基于原生的session的
Session(app) class LoginForm(Form):
username = simple.StringField(
label="用户名",
validators=[
validators.DataRequired(message="用户名不能为空"),
validators.Length(min=4, max=8, message="用户名必须大于等于4,小于等于8")
]
)
password = simple.PasswordField(
label="密码",
validators=[
validators.DataRequired(message="密码不能为空"),
validators.Length(min=4, max=8, message="密码必须大于等于4,小于等于8")
]) @app.route('/login',methods=['GET','POST'])
def login():
login_form = LoginForm()
if request.method == "GET":
return render_template('login.html', lf=login_form)
else:
login_form_data = LoginForm(request.form)
if login_form_data.validate():
session['user'] = login_form_data.data.get('username')
return str(session["user"])
else:
return render_template("login.html", lf=login_form_data) class RegForm(Form):
username = simple.StringField(
label="用户名",
validators=[
validators.DataRequired(message="用户名不能为空"),
]
)
password = simple.PasswordField(
label="密码",
validators=[
validators.DataRequired(message="密码不能为空"),
validators.Length(min=6, max=16, message="密码必须大于等于6,小于等于16")
])
repassword = simple.PasswordField(
label="确认密码",
validators=[
validators.EqualTo("password", message="两次密码不一致")
]
)
gender = core.SelectField(
label="性别",
choices=(
(1, "女"),
(2, "男")
),
default=1,
# widget=widgets.RadioInput(),
# render_kw={"class": "my_class"},
coerce=int
)
email = simple.StringField(
label="邮箱",
validators=[
validators.DataRequired(message="邮箱不能为空"),
validators.Email(message="不符合规定")
]
)
hobby = core.SelectMultipleField(
label="癖好",
choices=(
(1, "萝莉"),
(2, "御姐"),
(3, "小哥哥"),
(4, "正太")
),
# widget=widgets.,
coerce=int,
default=(1, 4)
) @app.route('/reg', methods=['GET', 'POST'])
def reg():
if request.method == "GET":
rf = RegForm()
return render_template("reg.html", rf=rf)
else:
rf_data = RegForm(request.form)
if rf_data.validate():
print(rf_data.data.get("hobby"))
print(type(rf_data.data.get("gender")))
return "注册成功"
else:
return render_template("reg.html", rf=rf_data) if __name__ == '__main__':
app.run()

登录模板:login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data" novalidate>
<p>{{ lf.username.label }}:{{ lf.username }}{{ lf.username.errors.0 }}</p>
<p>{{ lf.password.label }}:{{ lf.password }}{{ lf.password.errors[0] }}</p>
<input type="submit" value="登录">
</form>
</body>
</html>

模板中也可以直接循环获取模板数据如下的注册页面

注册模板:reg.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style></style>
</head> <body>
<form action="" method="post" novalidate>
{% for field in rf %}
<p>{{ field.label }}{{ field }} <span style="color: red">{{ field.errors.0 }}</span></p>
{% endfor %}
<input type="submit" value="注册"> </form>
</body>
</html>

最新文章

  1. [ubuntu]中文用户目录路径改英文
  2. 转:java多线程--同步容器
  3. JQuery:JQuery 中的CSS()方法
  4. 机器学习技法-随机森林(Random Forest)
  5. struts2标签获取parameter,request,session,application中的值
  6. USB做Host的OTG原理
  7. Android-为何以及如何保存Fragment实例
  8. .net对象转Datable
  9. hadoop笔记之Hive的数据存储(外部表)
  10. SHDocVw, AxSHDocVw的引用
  11. team viewer - rollback framework could not be initialized
  12. 第七十七节,CSS3前缀和rem长度单位
  13. devexpress控件layoutview特效之一旋转木马的实现
  14. 容器扩展属性 IExtenderProvider 实现WinForm通用数据验证组件
  15. PJSIP 自动化测试工具安装 Python安装
  16. 使用VMware 虚拟linux系统环境
  17. 使用VMware Workstation 14 Player或者Oracle VM VirtualBox安装Fedora-Workstation-netinst-x86_64-27-1.6操作系统的相关记录
  18. python 中的map,dict,lambda,reduce,filter
  19. Uva 11520 - Fill the Square 贪心 难度: 0
  20. 匿名内部类访问方法成员变量需要加final的原因及证明(转)

热门文章

  1. Redis的复制特性
  2. geoserver 开发1
  3. [BAT] xcopy拷贝远程服务器共享文件到本地
  4. Javascript 常用扩展方法
  5. 支持向量机(SVM)算法
  6. java网络爬虫实现信息的抓取
  7. arduino空调遥控器
  8. vi 基本使用命令
  9. 笔记:CSS常用中文字体英文名称对照表
  10. HDU1269 迷宫城堡 2016-07-24 13:47 84人阅读 评论(0) 收藏