flask中的wtforms使用方法


Posted in Python onJuly 21, 2018

一、简单介绍flask中的wtforms

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

安装:

pip3 install wtforms

二、简单使用wtforms组件

1、用户登录

flask中的wtforms使用方法

具体代码:

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 = 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、用户注册

flask中的wtforms使用方法

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 widgets

app = 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, 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 md5

app = Flask(__name__, template_folder='templates')
app.debug = True


class 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()

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

Python 相关文章推荐
python获取豆瓣电影简介代码分享
Jan 16 Python
使用Python实现下载网易云音乐的高清MV
Mar 16 Python
详细探究Python中的字典容器
Apr 14 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
Django框架模板介绍
Jan 15 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
python中append实例用法总结
Jul 30 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 Python
Python读取表格类型文件代码实例
Feb 17 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 Python
Elasticsearch 数据类型及管理
Apr 19 Python
详解flask表单提交的两种方式
Jul 21 #Python
python实现周期方波信号频谱图
Jul 21 #Python
Flask-Mail用法实例分析
Jul 21 #Python
python实现傅里叶级数展开的实现
Jul 21 #Python
Python实现快速傅里叶变换的方法(FFT)
Jul 21 #Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 #Python
opencv python 傅里叶变换的使用
Jul 21 #Python
You might like
PHP教程 变量定义
2009/10/23 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
js选项卡的实现方法
2015/02/09 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
用move.js库实现百叶窗特效
2017/02/08 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
使用vue for时为什么要key【推荐】
2019/07/11 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
Python ZipFile模块详解
2013/11/01 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
python实现取余操作的简单实例
2020/08/16 Python
Pycharm 如何一键加引号的方法步骤
2021/02/05 Python
Dodax奥地利:音乐、电影、书籍、玩具、电子产品等
2019/08/31 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
银行实习生的自我评价
2013/12/09 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
学校施工安全责任书
2015/01/29 职场文书
学校重阳节活动总结
2015/03/24 职场文书
活动经费申请报告
2015/05/15 职场文书
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python