wtforms组件使用

1.1.安装

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

  1. pip install wtforms

1.2.用户登录

用户登录时,对用户名和密码进行验证

(1)app.py

  1. from flask import Flask, render_template, request, redirect
  2. from wtforms import Form
  3. from wtforms.fields import simple
  4. from wtforms import validators
  5. from wtforms import widgets
  6.  
  7. app = Flask(__name__, template_folder='templates')
  8. app.debug = True
  9.  
  10. class LoginForm(Form):
  11. name = simple.StringField(
  12. label='用户名',
  13. #自定义的验证规则
  14. validators=[
  15. validators.DataRequired(message='用户名不能为空.'),
  16. validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d')
  17. ],
  18. #页面显示的插件
  19. widget=widgets.TextInput(),
  20. #加属性
  21. render_kw={'class': 'form-control'}
  22. )
  23.  
  24. pwd = simple.PasswordField(
  25. label='密码',
  26. validators=[
  27. validators.DataRequired(message='密码不能为空.'),
  28. validators.Length(min=8, message='用户名长度必须大于%(min)d'),
  29. #正则表达式
  30. validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",
  31. message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')
  32.  
  33. ],
  34. widget=widgets.PasswordInput(),
  35. render_kw={'class': 'form-control'}
  36. )
  37.  
  38. @app.route('/login', methods=['GET', 'POST'])
  39. def login():
  40. if request.method == 'GET':
  41. form = LoginForm()
  42. return render_template('login.html', form=form)
  43. else:
  44. form = LoginForm(formdata=request.form)
  45. if form.validate():
  46. print('用户提交数据通过格式验证,提交的值为:', form.data)
  47. else:
  48. print(form.errors)
  49. return render_template('login.html', form=form)
  50.  
  51. if __name__ == '__main__':
  52. app.run()

(2)login.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>登录</h1>
  9. <form method="post">
  10.  
  11. <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p>
  12.  
  13. <p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p>
  14. <input type="submit" value="提交">
  15.  
  16. </form>
  17. </body>
  18. </html>

用户名和密码格式不对

1.3.用户注册

(1)app.py

  1. from flask import Flask, render_template, request, redirect
  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. 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='derek'
  21. )
  22.  
  23. pwd = simple.PasswordField(
  24. label='密码',
  25. validators=[
  26. validators.DataRequired(message='密码不能为空.')
  27. ],
  28. widget=widgets.PasswordInput(),
  29. render_kw={'class': 'form-control'}
  30. )
  31.  
  32. pwd_confirm = simple.PasswordField(
  33. label='重复密码',
  34. validators=[
  35. validators.DataRequired(message='重复密码不能为空.'),
  36. #EqualTo:要跟那个字段一样
  37. validators.EqualTo('pwd', message="两次密码输入不一致")
  38. ],
  39. widget=widgets.PasswordInput(),
  40. render_kw={'class': 'form-control'}
  41. )
  42.  
  43. email = html5.EmailField(
  44. label='邮箱',
  45. validators=[
  46. validators.DataRequired(message='邮箱不能为空.'),
  47. validators.Email(message='邮箱格式错误')
  48. ],
  49. widget=widgets.TextInput(input_type='email'),
  50. render_kw={'class': 'form-control'}
  51. )
  52.  
  53. #RadiField单选
  54. gender = core.RadioField(
  55. label='性别',
  56. choices=(
  57. (1, '男'),
  58. (2, '女'),
  59. ),
  60. coerce=int #因为前段提交过来的数据都是str格式,比如“1”,“2”,这里转换成int
  61. )
  62. #单选的下拉框
  63. city = core.SelectField(
  64. label='城市',
  65. choices=(
  66. ('bj', '北京'),
  67. ('sh', '上海'),
  68. )
  69. )
  70. #多选的下拉框
  71. hobby = core.SelectMultipleField(
  72. label='爱好',
  73. choices=(
  74. (1, '篮球'),
  75. (2, '足球'),
  76. ),
  77. coerce=int
  78. )
  79.  
  80. favor = core.SelectMultipleField(
  81. label='喜好',
  82. choices=(
  83. (1, '篮球'),
  84. (2, '足球'),
  85. ),
  86. widget=widgets.ListWidget(prefix_label=False),
  87. option_widget=widgets.CheckboxInput(), #多选
  88. coerce=int,
  89. default=[1, 2]
  90. )
  91.  
  92. def __init__(self, *args, **kwargs):
  93. super(RegisterForm, self).__init__(*args, **kwargs)
  94. #重写默认的方法
  95. self.favor.choices = ((1, '篮球'), (2, '足球'), (3, '羽毛球'))
  96.  
  97. #钩子函数
  98. def validate_pwd_confirm(self, field):
  99. """
  100. 自定义pwd_confirm字段规则,例:与pwd字段是否一致
  101. :param field:
  102. :return:
  103. """
  104. # 最开始初始化时,self.data中已经有所有的值
  105.  
  106. if field.data != self.data['pwd']:
  107. # raise validators.ValidationError("密码不一致") # 继续后续验证
  108. raise validators.StopValidation("密码不一致") # 不再继续后续验证
  109.  
  110. @app.route('/register', methods=['GET', 'POST'])
  111. def register():
  112. if request.method == 'GET':
  113. #data={'gender': 1 } 传到前端页面显示的默认值,这里只设置了gender,其它字段也可以通过这种方式设置
  114. form = RegisterForm(data={'gender': 1})
  115. return render_template('register.html', form=form)
  116. else:
  117. form = RegisterForm(formdata=request.form)
  118. if form.validate():
  119. print('用户提交数据通过格式验证,提交的值为:', form.data)
  120. else:
  121. print(form.errors)
  122. return render_template('register.html', form=form)
  123.  
  124. if __name__ == '__main__':
  125. app.run()

(2).register.html

可以直接循环取出所有字段

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8.  
  9. <h1>用户注册</h1>
  10. <form method="post" novalidate style="padding:0 50px">
  11. {% for item in form %}
  12. <p>{{item.label}}: {{item}} {{item.errors[0] }}</p>
  13. {% endfor %}
  14. <input type="submit" value="提交">
  15.  
  16. </form>
  17. </body>
  18. </html>

注册页面显示:

Flask信号和wtforms的更多相关文章

  1. flask中的wtforms使用

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

  2. flask框架----flask中的wtforms使用

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

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

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

  4. flask信号使用

    flask信号: 安装: flask中的信号使用的是一个第三方插件,叫做blinker.通过pip list看一下,如果没有安装,通过以下命令即可安装blinker: pip install blin ...

  5. 信号(Django信号、Flask信号、Scrapy信号)

    简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...

  6. Flask系列(七)Flask中的wtforms使用

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

  7. Flask - WTF和WTForms创建表单

    目录 Flask - WTF和WTForms创建表单 一. Flask-WTF 1.创建基础表单 2.CSRF保护 3.验证表单 4.文件上传 5.验证码 二. WTForms 1. field字段 ...

  8. Flask基础(16)-->WTForms表单创建和简单验证

    Flask基础(16)-->WTForms表单创建和简单验证 前言:使用Flask_WTF需要配置参数SECRET_KEYCSRF_ENABLED是为了CSRF(跨站请求伪造)保护.SECRET ...

  9. Flask【第7篇】:Flask中的wtforms使用

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

随机推荐

  1. 基于Android的手机程序----口袋理财(13年版)

    主页面 记账模块 司机模块 司机明细 司机记录 贷款计算 其他功能 收支一览 统计报表 购物计划 设置模块 使用说明 收支项目 项目添加

  2. 4种方法让SpringMVC接收多个对象(转:http://blog.csdn.net/lutinghuan/article/details/46820023)

    问题背景: 我要在一个表单里同时一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该如何处理? 第1种方法:表单提交,以字段数组接收: 第2种方 ...

  3. 关于Android自定义view 你所需要知道的基本函数

    开始时之前想吐槽一句..iphone的闹钟,12小时制.我成功的把闹钟订到了下午5:00 导致错过一班飞机.心疼改签费. 候机ing,没有事做,来写一下学习自定义view必须掌握的基本函数.这里只挑一 ...

  4. 菜鸟玩云计算之廿一: saltstack之pillar

    菜鸟玩云计算之廿一: saltstack之pillar 参考: 点击打开链接 查看pillar数据: # salt '*' pillar.items pillar的默认根目录在:/srv/pillar ...

  5. saiku 网站简介

    Saiku web:http://docs.analytical-labs.com/saiku/documentation/2013/08/15/datasources.html Click &quo ...

  6. 关于iOS中几种第三方对XML/JSON数据解析的使用

    Json XML 大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式.一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特 ...

  7. 自定义view入门

    如何自定义控件主要分为以下几个步骤: 1.自定义属性的声明与获取 (1)分析需要的自定义属性 (2)在res/values/attrs.xml定义声明,如 <resources> < ...

  8. LIRe 源代码分析 6:检索(ImageSearcher)[以颜色布局为例]

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

  9. ITU-T Technical Paper: 测量QoS的基本网络模型

    本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...

  10. 物理引擎中velocity的单位是个什么鬼?

    现在, 你可能对于什么是velocity的单位感到奇怪.他是单位秒中经过点的一个可测量的量(pt/s).如果你想要在iphone横屏从左往右的移动物体,并且你想在1秒内移动1024个点,那么物体的x速 ...