侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

flask中的wtforms使用方法

技术  /  管理员 发布于 7年前   324

一、简单介绍flask中的wtforms

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

安装:

pip3 install wtforms

二、简单使用wtforms组件

1、用户登录

具体代码:

from flask import Flask,render_template,request,redirectfrom wtforms.fields import corefrom wtforms.fields import html5from wtforms.fields import simplefrom wtforms import Formfrom wtforms import validatorsfrom wtforms import widgetsapp = Flask(__name__,template_folder="templates")class Myvalidators(object):  '''自定义验证规则'''  def __init__(self,message):    self.message = message  def __call__(self, form, field):    print(field.data,"用户输入的信息")    if field.data == "haiyan":      return None    raise 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,requestfrom wtforms import Formfrom wtforms.fields import corefrom wtforms.fields import html5from wtforms.fields import simplefrom wtforms import validatorsfrom 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.EmailField    label='邮箱',    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, sessionfrom wtforms import Formfrom wtforms.csrf.core import CSRFfrom wtforms.fields import corefrom wtforms.fields import html5from wtforms.fields import simplefrom wtforms import validatorsfrom wtforms import widgetsfrom 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 very  secure, so don't use me.  """  def setup_form(self, form):    self.csrf_context = form.meta.csrf_context()    self.csrf_secret = form.meta.csrf_secret    return super(MyCSRF, self).setup_form(form)  def generate_csrf_token(self, csrf_token):    gid = self.csrf_secret + self.csrf_context    token = md5(gid.encode('utf-8')).hexdigest()    return token  def 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标签name    csrf_field_name = 'csrf_token'    # 自动生成标签的值,加密用的csrf_secret    csrf_secret = 'xxxxxx'    # 自动生成标签的值,加密用的csrf_context    csrf_context = lambda x: request.url    # 生成和比较csrf标签    csrf_class = MyCSRF    # -- i18n    # 是否支持本地化    # locales = False    locales = ('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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Flask框架Flask-Login用法分析
    下一条:
    详解flask表单提交的两种方式
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客