flask中的wtforms使用

一、简单介绍flask中的wtforms

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

安装:

  1. pip3 install wtforms

二、简单使用wtforms组件

1、用户登录

具体代码:

  1. from flask import Flask,render_template,request,redirect
  2. from wtforms.fields import core
  3. from wtforms.fields import html5
  4. from wtforms.fields import simple
  5. from wtforms import Form
  6. from wtforms import validators
  7. from wtforms import widgets
  8. app = Flask(__name__,template_folder="templates")
  9.  
  10. class Myvalidators(object):
  11. '''自定义验证规则'''
  12. def __init__(self,message):
  13. self.message = message
  14. def __call__(self, form, field):
  15. print(field.data,"用户输入的信息")
  16. if field.data == "haiyan":
  17. return None
  18. raise validators.ValidationError(self.message)
  19.  
  20. class LoginForm(Form):
  21. '''Form'''
  22. name = simple.StringField(
  23. label="用户名",
  24. widget=widgets.TextInput(),
  25. validators=[
  26. Myvalidators(message="用户名必须是haiyan"),#也可以自定义正则
  27. validators.DataRequired(message="用户名不能为空"),
  28. validators.Length(max=8,min=3,message="用户名长度必须大于%(max)d且小于%(min)d")
  29. ],
  30. render_kw={"class":"form-control"} #设置属性
  31. )
  32.  
  33. pwd = simple.PasswordField(
  34. label="密码",
  35. validators=[
  36. validators.DataRequired(message="密码不能为空"),
  37. validators.Length(max=8,min=3,message="密码长度必须大于%(max)d且小于%(min)d"),
  38. validators.Regexp(regex="\d+",message="密码必须是数字"),
  39. ],
  40. widget=widgets.PasswordInput(),
  41. render_kw={"class":"form-control"}
  42. )
  43.  
  44. @app.route('/login',methods=["GET","POST"])
  45. def login():
  46. if request.method =="GET":
  47. form = LoginForm()
  48. return render_template("login.html",form=form)
  49. else:
  50. form = LoginForm(formdata=request.form)
  51. if form.validate():
  52. print("用户提交的数据用过格式验证,值为:%s"%form.data)
  53. return "登录成功"
  54. else:
  55. print(form.errors,"错误信息")
  56. return render_template("login.html",form=form)
  57.  
  58. if __name__ == '__main__':
  59. # app.__call__()
  60. app.run(debug=True)

login.html

  1. <body>
  2. <form action="" method="post" novalidate>
  3. <p>{{ form.name.label }} {{ form.name }} {{ form.name.errors.0 }}</p>
  4. <p>{{ form.pwd.label }} {{ form.pwd }} {{ form.pwd.errors.0 }}</p>
  5. <input type="submit" value="提交">
  6. <!--用户名:<input type="text">-->
  7. <!--密码:<input type="password">-->
  8. <!--<input type="submit" value="提交">-->
  9. </form>
  10. </body>

2、用户注册

  1. from flask import Flask,render_template,redirect,request
  2. from wtforms import Form
  3. from wtforms.fields import core
  4. from wtforms.fields import html5
  5. from wtforms.fields import simple
  6. from wtforms import validators
  7. from wtforms import widgets
  8.  
  9. app = Flask(__name__,template_folder="templates")
  10. app.debug = True

  11. =======================simple===========================
  12. class RegisterForm(Form):
  13. name = simple.StringField(
  14. label="用户名",
  15. validators=[
  16. validators.DataRequired()
  17. ],
  18. widget=widgets.TextInput(),
  19. render_kw={"class":"form-control"},
  20. default="haiyan"
  21. )
  22. pwd = simple.PasswordField(
  23. label="密码",
  24. validators=[
  25. validators.DataRequired(message="密码不能为空")
  26. ]
  27. )
  28. pwd_confim = simple.PasswordField(
  29. label="重复密码",
  30. validators=[
  31. validators.DataRequired(message='重复密码不能为空.'),
  32. validators.EqualTo('pwd',message="两次密码不一致")
  33. ],
  34. widget=widgets.PasswordInput(),
  35. render_kw={'class': 'form-control'}
  36. )
  37.  
  38.   ========================html5============================
  39. email = html5.EmailField( #注意这里用的是html5.EmailField
  40. label='邮箱',
  41. validators=[
  42. validators.DataRequired(message='邮箱不能为空.'),
  43. validators.Email(message='邮箱格式错误')
  44. ],
  45. widget=widgets.TextInput(input_type='email'),
  46. render_kw={'class': 'form-control'}
  47. )
  48.  
  49.   ===================以下是用core来调用的=======================
  50. gender = core.RadioField(
  51. label="性别",
  52. choices=(
  53. (1,"男"),
  54. (1,"女"),
  55. ),
  56. coerce=int #限制是int类型的
  57. )
  58. city = core.SelectField(
  59. label="城市",
  60. choices=(
  61. ("bj","北京"),
  62. ("sh","上海"),
  63. )
  64. )
  65. hobby = core.SelectMultipleField(
  66. label='爱好',
  67. choices=(
  68. (1, '篮球'),
  69. (2, '足球'),
  70. ),
  71. coerce=int
  72. )
  73. favor = core.SelectMultipleField(
  74. label="喜好",
  75. choices=(
  76. (1, '篮球'),
  77. (2, '足球'),
  78. ),
  79. widget = widgets.ListWidget(prefix_label=False),
  80. option_widget = widgets.CheckboxInput(),
  81. coerce = int,
  82. default = [1, 2]
  83. )
  84.  
  85. def __init__(self,*args,**kwargs): #这里的self是一个RegisterForm对象
  86. '''重写__init__方法'''
  87. super(RegisterForm,self).__init__(*args, **kwargs) #继承父类的init方法
  88. self.favor.choices =((1, '篮球'), (2, '足球'), (3, '羽毛球')) #吧RegisterForm这个类里面的favor重新赋值
  89.  
  90. def validate_pwd_confim(self,field,):
  91. '''
  92. 自定义pwd_config字段规则,例:与pwd字段是否一致
  93. :param field:
  94. :return:
  95. '''
  96. # 最开始初始化时,self.data中已经有所有的值
  97. if field.data != self.data['pwd']:
  98. # raise validators.ValidationError("密码不一致") # 继续后续验证
  99. raise validators.StopValidation("密码不一致") # 不再继续后续验证
  100.  
  101. @app.route('/register',methods=["GET","POST"])
  102. def register():
  103. if request.method=="GET":
  104. form = RegisterForm(data={'gender': 1}) #默认是1,
  105. return render_template("register.html",form=form)
  106. else:
  107. form = RegisterForm(formdata=request.form)
  108. if form.validate(): #判断是否验证成功
  109. print('用户提交数据通过格式验证,提交的值为:', form.data) #所有的正确信息
  110. else:
  111. print(form.errors) #所有的错误信息
  112. return render_template('register.html', form=form)
  113.  
  114. if __name__ == '__main__':
  115. app.run()

register.html

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

3、meta

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from flask import Flask, render_template, request, redirect, session
  4. from wtforms import Form
  5. from wtforms.csrf.core import CSRF
  6. from wtforms.fields import core
  7. from wtforms.fields import html5
  8. from wtforms.fields import simple
  9. from wtforms import validators
  10. from wtforms import widgets
  11. from hashlib import md5
  12.  
  13. app = Flask(__name__, template_folder='templates')
  14. app.debug = True
  15.  
  16. class MyCSRF(CSRF):
  17. """
  18. Generate a CSRF token based on the user's IP. I am probably not very
  19. secure, so don't use me.
  20. """
  21.  
  22. def setup_form(self, form):
  23. self.csrf_context = form.meta.csrf_context()
  24. self.csrf_secret = form.meta.csrf_secret
  25. return super(MyCSRF, self).setup_form(form)
  26.  
  27. def generate_csrf_token(self, csrf_token):
  28. gid = self.csrf_secret + self.csrf_context
  29. token = md5(gid.encode('utf-8')).hexdigest()
  30. return token
  31.  
  32. def validate_csrf_token(self, form, field):
  33. print(field.data, field.current_token)
  34. if field.data != field.current_token:
  35. raise ValueError('Invalid CSRF')
  36.  
  37. class TestForm(Form):
  38. name = html5.EmailField(label='用户名')
  39. pwd = simple.StringField(label='密码')
  40.  
  41. class Meta:
  42. # -- CSRF
  43. # 是否自动生成CSRF标签
  44. csrf = True
  45. # 生成CSRF标签name
  46. csrf_field_name = 'csrf_token'
  47.  
  48. # 自动生成标签的值,加密用的csrf_secret
  49. csrf_secret = 'xxxxxx'
  50. # 自动生成标签的值,加密用的csrf_context
  51. csrf_context = lambda x: request.url
  52. # 生成和比较csrf标签
  53. csrf_class = MyCSRF
  54.  
  55. # -- i18n
  56. # 是否支持本地化
  57. # locales = False
  58. locales = ('zh', 'en')
  59. # 是否对本地化进行缓存
  60. cache_translations = True
  61. # 保存本地化缓存信息的字段
  62. translations_cache = {}
  63.  
  64. @app.route('/index/', methods=['GET', 'POST'])
  65. def index():
  66. if request.method == 'GET':
  67. form = TestForm()
  68. else:
  69. form = TestForm(formdata=request.form)
  70. if form.validate():
  71. print(form)
  72. return render_template('index.html', form=form)
  73.  
  74. if __name__ == '__main__':
  75. app.run()

Flask【第7篇】:Flask中的wtforms使用的更多相关文章

  1. Flask最强攻略 - 跟DragonFire学Flask - 第六篇 Flask 中内置的 Session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

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

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  3. flask 第六篇 flask内置的session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from ...

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

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

  5. Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  6. Flask学习【第7篇】:Flask中的wtforms使用

    简介flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装 pip3 install wtforms 简单使用wtforms组件 用 ...

  7. 第三篇 Flask 中的 request

    第三篇 Flask 中的 request   每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前 ...

  8. 第二篇 Flask 中的 Render Redirect HttpResponse

    第二篇 Flask 中的 Render Redirect HttpResponse   1.Flask中的HTTPResponse 在Flask 中的HttpResponse 在我们看来其实就是直接返 ...

  9. 第九篇 Flask 中的蓝图(BluePrint)

    第九篇 Flask 中的蓝图(BluePrint)   蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? ...

随机推荐

  1. C# CLR20R3 程序终止的几种解决方案 【转】

    [转]CLR20R3 程序终止的几种解决方案   这是因为.NET Framework 1.0 和 1.1 这两个版本对许多未处理异常(例如,线程池线程中的未处理异常)提供支撑,而 Framework ...

  2. linux(centOS7)的基本操作(一) 概述

    linux服务器的连接 1.连接 window环境下需要安装XShell.XFtp等软件,暂时不表: macOS环境下直接用ssh命令登录即可,用以下任意一种 ssh [-p port] userna ...

  3. 四种方法 恢复损坏的Excel文档

    四种方法 恢复损坏的Excel文档 打开一个以前编辑好的Excel工作簿,却发现内容混乱,无法继续进行编辑,而且还不能够进行打印.这是很多朋友在处理Excel文件时都可能会遇到的一个问题,面对这种情况 ...

  4. 中国MOOC_零基础学Java语言_第3周 循环_1奇偶个数

    第3周编程题 查看帮助 返回   第3周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...

  5. Linux安装MySql5.7及配置(yum安装)

    Linux安装MySql5.7及配置(yum安装) [root@xld ~]# rpm -q centos-release centos-release-7-7.1908.0.el7.centos.x ...

  6. 【web前端】前段时间的面题整理(1)

    这是我的试题答案整理,可能有多种答案.我也就写了一两种.在慢慢整合中 第一题 用js实现随机选取10-100之间的10个数字,存入一个数组,去重后求和(保证这10个数字不能出现重复) 要求:去重不能使 ...

  7. 【不错】MySQL 事务隔离级别

    一.事务描述 1.事务的四个特性 ACID 1. A:原子性 = 一个事务或者都成功.或者都失败: 2. C:一致性 = 在整个事务的生命周期里面,查询到的数据是一致的: MVCC多版本并发控制:利用 ...

  8. python基础:multiprocessing的使用

    不同于C++或Java的多线程,python中是使用多进程来解决多项任务并发以提高效率的问题,依靠的是充分使用多核CPU的资源.这里是介绍mulitiprocessing的官方文档:https://d ...

  9. 【Qt开发】QThread介绍

    回顾Qt之线程(QThread),里面讲解了如何使用线程,但还有很多人留言没有看明白,那么今天我们来一起瞅瞅关于QThread管理线程的那些事儿... 一.线程管理 1.线程启动 void start ...

  10. 分享一个linux系统中采用嵌套for循环比较两个数组内容,并输出相同值的shell脚本

    #!/bin/bash array1=(1 3 5 6 7 9) array2=(3 4 9) echo array1=${array1[@]} echo array2=${array2[@]} fo ...