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

  1. flask框架----flask入门

    一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  2. flask框架----flask基础

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

  3. Flask框架(一)

    Flask框架 Flask本身想当于一个内核,其自身几乎所有功能都依靠扩展(邮件扩展Flask-Mail.用户认证Flask-Login),都需要用第三方的扩展来实现.其WSGI工具箱采用Werkze ...

  4. 个人技术博客——linux服务器配置以及flask框架

    本次的软件工程实践,我负责我们组后台服务的搭建,我选用了bandwagon的服务器,安装的是Debian GNU/Linux,全程在root用户下操作,后端服务是用python的flask框架,数据库 ...

  5. Flask框架 请求与响应 & 模板语法

    目录 Flask框架 请求与响应 & 模板语法 简单了解Flask框架 Flask 框架 与 Django 框架对比 简单使用Flask提供服务 Flask 中的 Response(响应) F ...

  6. flask框架中使用wtforms

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

  7. flask中的wtforms使用

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

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

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

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

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

随机推荐

  1. openssl生成RSA公钥和私钥对

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

  2. Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型

    一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...

  3. Java 基础 面向对象和抽象类

    面向对象变量 局部变量和成员变量区别 区别一:定义的位置不同 定义在类中的变量是成员变量 定义在方法中或者{}语句里面的变量是局部变量 区别二:在内存中的位置不同 成员变量存储在对内存的对象中 局部变 ...

  4. k8s 容器的生命周期钩子

    钩子有两个一个容器起之前定义一个动作PostStart,容器关闭之前定义一个动作PreStop 动作可以是一个命令或http请求 示例 spec: containers: - lifecycle: p ...

  5. k8s 高级调度 亲和力和反亲和力、绑定标签、污点容忍污点

    通过标签绑定 spec: nodeSelector: bigdata-node: bigdata containers: - env: pod只能运行在有bigdata-node: bigdata 标 ...

  6. socket发送http报文的疑惑(求高手指点一二)

    给8080或80端口的服务端(自己写的serverSocket服务端)发送字符串,此字符串按照http协议拼接而成,既是所谓的http报文.服务端接受成功.如果在报头与消息体之间少了“\r\n\r\n ...

  7. 关于RTSP-Over-HTTP

    --------------------更新2018.07.10------------------- myRtspClient-1.3.0开始支持RTSP-Over-HTTP ----------- ...

  8. [LeetCode] 276. Paint Fence_Easy tag: Dynamic Programming

    There is a fence with n posts, each post can be painted with one of the k colors. You have to paint ...

  9. curl不能支持https问题

    前面说了 update nss 并没有解决问题. 想办法重新安装一下:CURL 1.下载安装包 [root@mycentos ~]# wget https://curl.haxx.se/downloa ...

  10. python threading

    //test.py 1 import threading 2 import time 3 4 exitFlag = 0 5 6 class myThread (threading.Thread): 7 ...