一、简单介绍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中的wtforms使用的更多相关文章

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

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

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

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

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

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

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

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

  5. Flask中的before_request装饰器和after_request装饰器以及WTForms组件

    一.before_request装饰器和after_request装饰器 我们现在有一个Flask程序其中有3个路由和视图函数 from flask import Flask app = Flask( ...

  6. flask框架----整合Flask中的目录结构

    一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...

  7. Python框架学习之Flask中的常用扩展包

    Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-scr ...

  8. 整合Flask中的目录结构

    一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...

  9. Flask学习【第11篇】:整合Flask中的一些知识点

    SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sq ...

随机推荐

  1. 登录mysql时的一些命令

    清屏: cls 只要输入cls然后回车运行命令,可以清屏. 查看版本号: mysql -V 注意:V一定要大写,如果不大写就错了... 登录: mysql -u用户名 -p密码 -P端口号 -h数据库 ...

  2. 解决ASP.NET中ServiceStack.Redis每小时6000次访问请求的问题

    1.可以使用3.0的版本: Install-Package ServiceStack.Redis -Version 3.0 2.使用ServiceStack.Redis.Complete: Insta ...

  3. Leetcode#561. Array Partition I(数组拆分 I)

    题目描述 给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最 ...

  4. Flask与mysql数据库字段类型的区别以及基本用法

    Mysql里面的int在Flask中里面使用Integer Mysql里面的varcahar在Flask中里面使用String 与Mysql数据库需要导入模块 #导入第三方链接库sql点金术 from ...

  5. java基础梳理--朝花夕拾(二)

    1.Java语言语法规则和文件格式: 第一个Java程序:/** 第一个Java程序:控制台输出Hello world!*/public class Test{    //访问修饰符 class关键词 ...

  6. 20165231 实验一 Java开发环境的熟悉

    实验报告封面 一.实验报告封面 课程:Java程序设计 班级:1652班 姓名:王杨鸿永 学号:20165231 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验时间:13:45 - 15:25 ...

  7. RabbitMQ与SpringBoot整合

    RabbitMQ  SpringBoot  一.RabbitMQ的介绍 二.Direct模式 三.Topic转发模式 四.Fanout Exchange形式 原文地址: https://www.cnb ...

  8. Palindrome Number & Reverse Integer

    Determine whether an integer is a palindrome. Do this without extra space. 分析:把一个数倒过来,然后看两个数是否相同. pu ...

  9. nginx 配置域名转发

    自己测试环境,配置下载目录和一个jenkins的地址: 域名跳转,反向代理 # cat ../nginx.conf user www www; worker_processes ; error_log ...

  10. mutt+msmtp实现在shell环境中发送电子邮件

    作者:邓聪聪 为了自动化接收服务端的文件备份信息,利用mutt+msmtp在shell环境中发送电子邮件,轻松高效的完成运维工作. 下载msmtp wget http://downloads.sour ...