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操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
Python 多线程Threading初学教程
Aug 22 Python
Python切片操作实例分析
Mar 16 Python
pycharm运行程序时在Python console窗口中运行的方法
Dec 03 Python
Python正则表达式匹配和提取IP地址
Jun 06 Python
python 自定义装饰器实例详解
Jul 20 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
python3 pathlib库Path类方法总结
Dec 26 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
Feb 07 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
Python实现结构体代码实例
Feb 10 Python
实操Python爬取觅知网素材图片示例
Nov 27 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 getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
smarty缓存用法分析
2014/12/16 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
最佳JS代码编写的14条技巧
2011/01/09 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
python动态加载变量示例分享
2014/02/17 Python
使用python解析xml成对应的html示例分享
2014/04/02 Python
python实现数通设备端口监控示例
2014/04/02 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
如何基于python测量代码运行时间
2019/12/25 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
通过代码实例了解Python sys模块
2020/09/14 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
高中生家长会演讲稿
2014/01/14 职场文书
装修五一活动策划案
2014/01/23 职场文书
工地例会施工汇报材料
2014/08/22 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
JavaScript函数柯里化
2021/11/07 Javascript
科普 | 业余无线电知识-波段篇
2022/02/18 无线电