一、简单介绍flask中的wtforms

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

安装:

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

Flask系列(七)Flask中的wtforms使用的更多相关文章

  1. iOS流布局UICollectionView系列七——三维中的球型布局

      摘要: 类似标签云的球状布局,也类似与魔方的3D布局 iOS流布局UICollectionView系列七——三维中的球型布局 一.引言 通过6篇的博客,从平面上最简单的规则摆放的布局,到不规则的瀑 ...

  2. Flask系列(二)Flask基础

    知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi(上线) 2.实例化Flask对象,里面是有参数的 app = F ...

  3. Flask系列(六)Flask实例化补充及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...

  4. Flask系列之蓝图中使用动态URL前缀

    让我们先来看一个简单的例子,假设有下面这样一个蓝图(是关于用户主页的): from flask import Blueprint, render_template profile = Blueprin ...

  5. flask系列七之cookie和session

    该部分参考链接: http://blog.csdn.net/qq_28877125/article/details/77677890 http://blog.csdn.net/qq_28877125/ ...

  6. Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler

    一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...

  7. Flask系列(四)Flask实现简单页面登陆

    from flask import Flask,render_template,request,redirect,session app = Flask(__name__,template_folde ...

  8. Flask系列(五)Flask实现分页

    一.flask分页组件 from urllib.parse import urlencode,quote,unquote class Pagination(object): ""& ...

  9. Spark系列(七)Master中的资源调度

    资源调度 说明: Application的调度算法有两种,分别为spreadOutApps和非spreadOutApps spreadOutApps 在spark-submit脚本中,可以指定要多少个 ...

随机推荐

  1. 不定义JQuery插件 不要说会JQuery

    二.普及JQuery知识 知识1:用JQuery写插件时,最核心的方法有如下两个: $.extend(object) 可以理解为JQuery 添加一个静态方法. $.fn.extend(object) ...

  2. Buff系统

    BUFF状态可以通过游戏道具.使用技能.被攻击技能.NPC.宠物等等实现.BUFF状态,有很多技能在释放后,会对目标产生一定时间的额外影响,这些影响有的是增益的,有的是减免的.比如法师的“熔岩地”,会 ...

  3. css两列等高布局

    布局方案 等高布局有几种不同的方法,但目前为止我认为浏览器兼容最好最简便的应该是padding补偿法.首先把列的padding-bottom设为一个足够大的值,再把列的margin-bottom设一个 ...

  4. windows上SVN图标不显示

    症状1:项目左侧导航栏表不能正常显示图标 方法:windows->preferences->General->Appearance->Label Decorations    ...

  5. mysql中,如何查看数据库中当前可用的校勘?字符集默认的collation?

    需求描述: mysql的字符集在使用的过程中会有一些规则,这些规则就组成了校勘, 也就是通过什么规则做什么事,比如,如何比较两个字符的大小,后台都是有一些 规则,这些规则就是校勘的一部分. 那么,查看 ...

  6. 【java】java内存模型(2)--volatile内存语义详解

    多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”.可见性的意思是当一个线程 ...

  7. [转]ASP.NET MVC 5– 使用Wijmo MVC 5模板1分钟创建应用

    开始使用 使用ComponentOne Studio for ASP.NET Wijmo制作MVC5应用程序,首先要做的是安装Studio for ASP.NET Wijmo . 测试环境 VS201 ...

  8. IM软件业务知识—导航

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

  9. simple fix 主从不一致滴error

    Last_SQL_Error: Error 'Unknown table 'bb'' on query. Default database: 'test'. Query: 'DROP TABLE `b ...

  10. 7 -- Spring的基本用法 -- 3... Spring 的核心机制 : 依赖注入

    7.3 Spring 的核心机制 : 依赖注入 Spring 框架的核心功能有两个. Spring容器作为超级大工厂,负责创建.管理所有的Java对象,这些Java对象被称为Bean. Spring容 ...