一、简单介绍flask中的wtforms

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

安装:

pip3 install wtforms

二、简单使用wtforms组件

1、用户登录

具体代码:

from  flask import Flask,render_template,request,redirect
from  wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import Form
from wtforms import validators
from wtforms import widgets
app = Flask(__name__,template_folder="templates")class Myvalidators(object):'''自定义验证规则'''def __init__(self,message):self.message = messagedef __call__(self, form, field):print(field.data,"用户输入的信息")if field.data == "haiyan":return Noneraise validators.ValidationError(self.message)class LoginForm(Form):'''Form'''name = simple.StringField(label="用户名",widget=widgets.TextInput(),validators=[Myvalidators(message="用户名必须是haiyan"),#也可以自定义正则validators.DataRequired(message="用户名不能为空"),validators.Length(max=8,min=3,message="用户名长度必须大于%(max)d且小于%(min)d")],render_kw={"class":"form-control"}  #设置属性)pwd = simple.PasswordField(label="密码",validators=[validators.DataRequired(message="密码不能为空"),validators.Length(max=8,min=3,message="密码长度必须大于%(max)d且小于%(min)d"),validators.Regexp(regex="\d+",message="密码必须是数字"),],widget=widgets.PasswordInput(),render_kw={"class":"form-control"})@app.route('/login',methods=["GET","POST"])
def login():if request.method =="GET":form = LoginForm()return render_template("login.html",form=form)else:form = LoginForm(formdata=request.form)if form.validate():print("用户提交的数据用过格式验证,值为:%s"%form.data)return "登录成功"else:print(form.errors,"错误信息")return render_template("login.html",form=form)if __name__ == '__main__':# app.__call__()app.run(debug=True)

login.html

<body>
<form action="" method="post" novalidate><p>{{ form.name.label }} {{ form.name }} {{ form.name.errors.0 }}</p><p>{{ form.pwd.label }} {{ form.pwd }} {{ form.pwd.errors.0 }}</p><input type="submit" value="提交"><!--用户名:<input type="text">--><!--密码:<input type="password">--><!--<input type="submit" value="提交">-->
</form>
</body>

2、用户注册

from flask import Flask,render_template,redirect,request
from wtforms import Form
from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgetsapp = Flask(__name__,template_folder="templates")
app.debug = True
=======================simple===========================
class RegisterForm(Form):name = simple.StringField(label="用户名",validators=[validators.DataRequired()],widget=widgets.TextInput(),render_kw={"class":"form-control"},default="haiyan")pwd = simple.PasswordField(label="密码",validators=[validators.DataRequired(message="密码不能为空")])pwd_confim = simple.PasswordField(label="重复密码",validators=[validators.DataRequired(message='重复密码不能为空.'),validators.EqualTo('pwd',message="两次密码不一致")],widget=widgets.PasswordInput(),render_kw={'class': 'form-control'})

  ========================html5============================email = html5.EmailField(  #注意这里用的是html5.EmailFieldlabel='邮箱',validators=[validators.DataRequired(message='邮箱不能为空.'),validators.Email(message='邮箱格式错误')],widget=widgets.TextInput(input_type='email'),render_kw={'class': 'form-control'})

  ===================以下是用core来调用的=======================gender = core.RadioField(label="性别",choices=((1,"男"),(1,"女"),),coerce=int  #限制是int类型的)city = core.SelectField(label="城市",choices=(("bj","北京"),("sh","上海"),))hobby = core.SelectMultipleField(label='爱好',choices=((1, '篮球'),(2, '足球'),),coerce=int)favor = core.SelectMultipleField(label="喜好",choices=((1, '篮球'),(2, '足球'),),widget = widgets.ListWidget(prefix_label=False),option_widget = widgets.CheckboxInput(),coerce = int,default = [1, 2])def __init__(self,*args,**kwargs):  #这里的self是一个RegisterForm对象'''重写__init__方法'''super(RegisterForm,self).__init__(*args, **kwargs)  #继承父类的init方法self.favor.choices =((1, '篮球'), (2, '足球'), (3, '羽毛球'))  #吧RegisterForm这个类里面的favor重新赋值def validate_pwd_confim(self,field,):'''自定义pwd_config字段规则,例:与pwd字段是否一致:param field::return:'''# 最开始初始化时,self.data中已经有所有的值if field.data != self.data['pwd']:# raise validators.ValidationError("密码不一致") # 继续后续验证raise validators.StopValidation("密码不一致")  # 不再继续后续验证@app.route('/register',methods=["GET","POST"])
def register():if request.method=="GET":form = RegisterForm(data={'gender': 1})  #默认是1,return render_template("register.html",form=form)else:form = RegisterForm(formdata=request.form)if form.validate():  #判断是否验证成功print('用户提交数据通过格式验证,提交的值为:', form.data)  #所有的正确信息else:print(form.errors)  #所有的错误信息return render_template('register.html', form=form)if __name__ == '__main__':app.run()

register.html

<body>
<h1>用户注册</h1>
<form method="post" novalidate style="padding:0  50px">{% for item in form %}<p>{{item.label}}: {{item}} {{item.errors[0] }}</p>{% endfor %}<input type="submit" value="提交">
</form>
</body>

3、meta

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask, render_template, request, redirect, session
from wtforms import Form
from wtforms.csrf.core import CSRF
from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets
from hashlib import md5app = Flask(__name__, template_folder='templates')
app.debug = Trueclass MyCSRF(CSRF):"""Generate a CSRF token based on the user's IP. I am probably not verysecure, so don't use me."""def setup_form(self, form):self.csrf_context = form.meta.csrf_context()self.csrf_secret = form.meta.csrf_secretreturn super(MyCSRF, self).setup_form(form)def generate_csrf_token(self, csrf_token):gid = self.csrf_secret + self.csrf_contexttoken = md5(gid.encode('utf-8')).hexdigest()return tokendef validate_csrf_token(self, form, field):print(field.data, field.current_token)if field.data != field.current_token:raise ValueError('Invalid CSRF')class TestForm(Form):name = html5.EmailField(label='用户名')pwd = simple.StringField(label='密码')class Meta:# -- CSRF# 是否自动生成CSRF标签csrf = True# 生成CSRF标签namecsrf_field_name = 'csrf_token'# 自动生成标签的值,加密用的csrf_secretcsrf_secret = 'xxxxxx'# 自动生成标签的值,加密用的csrf_contextcsrf_context = lambda x: request.url# 生成和比较csrf标签csrf_class = MyCSRF# -- i18n# 是否支持本地化# locales = Falselocales = ('zh', 'en')# 是否对本地化进行缓存cache_translations = True# 保存本地化缓存信息的字段translations_cache = {}@app.route('/index/', methods=['GET', 'POST'])
def index():if request.method == 'GET':form = TestForm()else:form = TestForm(formdata=request.form)if form.validate():print(form)return render_template('index.html', form=form)if __name__ == '__main__':app.run()

转载于:https://www.cnblogs.com/xiaohema/p/8456741.html

Flask 【第七篇】Flask中的wtforms使用相关推荐

  1. Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

    https://www.cnblogs.com/DragonFire/p/9259999.html 是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jin ...

  2. flask第七篇——URL与视图函数的映射

    有兴趣的朋友可以添加微信公众号:自动化测试实战 今天开始就要进入正题了.大家都准备好了吧~ 代码提示 先和大家说个小知识点:有同学后台说输入flask代码pycharm不提示,现在告诉你一个解决方法: ...

  3. Flask最强攻略 - 跟DragonFire学Flask - 第三篇 Flask 中的 request 之 先知道有这么个东西...

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  4. Flask 第三篇 Flask 中的 request

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  5. flask mvc模式开发_Flask中文文档-转载

    欢迎阅读 Flask 的文档.推荐您先阅读< 安装 >,然后阅读 < 快速上手 >.< 教程 >比快速上手文档更详细一点,该 文档介绍了如何创建一个完整(尽管很小) ...

  6. 【Flask】Jinja2之模板中使用url_for

    模版中的url_for跟我们后台视图函数中的url_for使用起来基本是一模一样的.也是传递视图函数的名字,也可以传递参数.使用的时候,需要在url_for左右两边加上一个{{ url_for('fu ...

  7. flask第二十篇——模板【3】

    请关注公众号:自动化测试实战 现在我们通过查询字符串的方式给render_template传参,我们就要用到flask库的flask.request.args.get()函数先获取参数,在index. ...

  8. 计算机网络中的冗余部件大大降低了可靠,大学计算机第七篇练习题

    <大学计算机第七篇练习题>由会员分享,可在线阅读,更多相关<大学计算机第七篇练习题(7页珍藏版)>请在技术文库上搜索. 1.10如果用户想访问某个站点,在IE浏览器地址栏中输入 ...

  9. Flask源码阅读-第四篇(flask\app.py)

    flask.app该模块2000多行代码,主要完成应用的配置.初始化.蓝图注册.请求装饰器定义.应用的启动和监听,其中以下方法可以重点品读和关注 def setupmethod(f): @setupm ...

最新文章

  1. MindSpore技术理解(下)
  2. 非关系型数据库(NoSQL)
  3. Python概念:生成唯一性序号uuid
  4. java list 拆分_Java面试题怎么确保一个集合不能被修改?
  5. 【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
  6. 闭关休养or趁火打劫:疫情之下焦点行业网络威胁分析
  7. 学编程一定要掌握的186个关键单词!
  8. input框自动填充内容背景颜色为黄色解决方法
  9. win7插了耳机还是外放_有哪些令人叫绝的智障设计?网友:手机取消耳机孔
  10. Evaluation or Assessment
  11. python两个等号和一个等号_Python-一个变量等于另一个变量
  12. 如何将IE浏览器设置为默认浏览器
  13. 关于鼠标手的症状和恢复方法
  14. 为什么说串行比并行快?
  15. 使用Python制作专属微信小客服
  16. android 仿微视,腾讯微视和抖音一样?模仿还是照搬?
  17. 中文文本分类 传统机器学习+深度学习
  18. maven项目安装本地包实战演示
  19. 同步群晖内的两个本地文件夹
  20. 基于springboot的校园二手交易系统-JAVA【数据库设计、论文、源码、开题报告】

热门文章

  1. 判断同构数 c语言,基于visual Studio2013解决C语言竞赛题之0413同构数
  2. windows xp https页面找不到_Windows 提权快速查找 Exp
  3. 电脑知识:分享实用的电脑维护小常识
  4. 系统测试:单元测试相关知识笔记
  5. 网络工程中,VLAN到底有什么作用?
  6. 操作系统基础:进程知识笔记(一)
  7. python刷题用leet_GitHub - Yolymaker/leetcode-python: 利用python分类刷leetcode题目
  8. 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)
  9. 特征选择算法java实现_relief算法特征选择
  10. python (第八章)补充-可迭代对象(补充高阶函数,以及常用的高阶函数)