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文件操作类操作实例详解
Jul 11 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
windows下numpy下载与安装图文教程
Apr 02 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
django的ORM操作 增加和查询
Jul 26 Python
Python turtle绘画象棋棋盘
Aug 21 Python
Pytorch中Tensor与各种图像格式的相互转化详解
Dec 26 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
通过cmd进入python的步骤
Jun 16 Python
python tqdm库的使用
Nov 30 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程序占用多少内存(memory_get_usage)
2012/09/23 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
PHP实现递归的三种方法
2020/07/04 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
客户端静态页面玩分页
2006/06/26 Javascript
免费空间广告万能消除代码
2006/09/04 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
微信小程序实现打卡签到页面
2020/09/21 Javascript
Python实现股市信息下载的方法
2015/06/15 Python
python开发之文件操作用法实例
2015/11/13 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
python requests 使用快速入门
2017/08/31 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
学习Python selenium自动化网页抓取器
2018/01/20 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
SQL Server笔试题
2012/01/10 面试题
酒店中秋节活动方案
2014/01/31 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
驾驶员培训方案
2014/05/01 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
优秀党员申报材料
2014/12/18 职场文书
海洋天堂观后感
2015/06/05 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang
Python必备技巧之字符数据操作详解
2022/03/23 Python
Python实现视频自动打码的示例代码
2022/04/08 Python