Flask表单验证组件WTForms

一、安装

pip install wtforms

二、简单的使用

# 第一中使用方法
from wtforms import Form, BooleanField,TextField,PasswordField,validators
class RegistrationForm(Form): # 定义的 form 表单类必须继承 Form
	username = TextField('Username', [validators.Length(min=4, max=25)],default='123')
	email = TextField('Email Address', [validators.Length(min=6, max=35)])
	password = PasswordField('New Password', [
		validators.Required(),
		validators.EqualTo('confirm', message='Passwords must match')
	])
	confirm = PasswordField('Repeat Password')
	accept_tos = BooleanField('I accept the TOS', [validators.Required()])
# 第二种使用方法
from wtforms.fields import core # 核心功能
from wtforms.fields import html5 # html5标签
from wtforms.fields import simple # 简单使用
from wtforms import Form
from wtforms import validators
from wtforms import widgets
class RegistrationForm(Form):
	username = simple.StringField(
		label='用户名',
		validators=[
			Myvalidators(message="用户名必须是haiyan"),#也可以自定义正则
			validators.DataRequired(message="用户名不能为空"),
			validators.Length(max=8,min=3,message="用户名长度必须大于%(max)d且小于%(min)d")
		],
		widget=widgets.TextInput(),
		render_kw={'style':'font-size:12px;','class':'user'},
		default='123',
	)
	password = simple.PasswordField(
		label='密码',
		validators=[
			validators.DataRequired(message="密码不能为空"),
			validators.Length(max=8,min=3,message="密码长度必须大于%(max)d且小于%(min)d"),
			validators.Regexp(regex="\d+",message="密码必须是数字"),
		],
		widget=widgets.PasswordInput(),
		render_kw={'style':'font-size:12px;','class':'pass'},# 设置input 属性
		default='123', # 默认的value
	)
from flask import Flask,render_template as render,request
app = Flask(__name__)
@app.route('/index',methods=['GET'])
def index():
	if request.method == 'GET':
		form = RegistrationForm()
		return render('index.html',form=form)
	form = RegistrationForm(formdata=request.form)
	print(form.data) # {'username': '123', 'password': 'tang'} 获取表单提交的数据
	print(form.data['username']) # 123 获取表单提交的单个数据
	if form.validate(): # 必须调用验证方法,form.validate() 进行验证,不然是不会进行验证的
	    print('验证成功')
	else:
	    return render('index.html',form=form)
PS:
1、字段名是区分大小写的
2、字段名不能以'_'开头
3、字段名不能以'validate'开头

Form的主要属性:
data:字典类型,包括每一个字段的数据。如果需要频繁访问字段值,可以使用form.<field>.data进行访问
errors:字典类型,包括每一个字段的错误信息。

三、字段以及参数

3.1、基本字段名称和含义

字段名 字段含义
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段,值为datetime.date 格式
DateTimeField 文本字段,值为datetime.datetime 格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为decimal.Decimal
FloatField 文本字段,值为浮点数
BooleanField 复选框,值为True 和False
RadioField 一组单选框
SelectField 下拉列表 参数:choices=[(1,‘one’),(2,‘two’)]
SelectMultipleField 下拉列表,可选择多个值
FileField 文件上传字段
SubmitField 表单提交按钮
FormField 把表单作为字段嵌入另一个表单
FieldList 一组指定类型的字段

3.2、字段的参数

四、模版中的表单

'''
以下是一个使用宏的示例
_formhelpers.html模板:
'''
{% macro render_field(field) %}
  <dt>{{ field.label }}</dt>
  <dd>
  	  {{ field(**kwargs)|safe }}
	  {% if field.errors %}
	    <ul class="errors">
	    {% for error in field.errors %}
	      <li>{{ error }}</li>
	    {% endfor %}
	    </ul>
	  {% endif %}
  </dd>
{% endmacro %}

以下是使用了上面的 _formhelpers.html 的 register.html 模板:

{% from "_formhelpers.html" import render_field %}
<form method="post" action="/register">
  <dl>
    {{ render_field(form.username) }}
    {{ render_field(form.email) }}
    {{ render_field(form.password) }}
    {{ render_field(form.confirm) }}
    {{ render_field(form.accept_tos) }}
    '''
    	显示名称:input框
   	{{ form.password.label }}:{{ form.password }} {{ form.errors.password }}
    	{% for i in form %}
    		{{ i.label }}:{{ i }}
    	{% endfor %}
    '''
  </dl>
  <p><input type="submit" value="Register"></p>
</form>

五、验证器validators

5.1、form表单类中的声明,以列表形式展现[]:

validators.DataRequired(‘错误提示’) 必填限制 
validators.Length(min=4,max=8,message=’错误提示’) 长度限制 
validators.Email(‘错误提示’) 邮箱验证 
validators.EqualTo(‘字段名’,’错误提示’)
username = StringField('用户名',[validator.DataRequired('用户名必填')])
password = IntegerField('密码',[validator.DataRequired('密码必填')])
userlevel = SelectField('用户权限',[validator.DataRequired('用户权限必填')])

5.2、常用的 Validators 属性

校验器 作用
Required 必填校验器,要求字段必须有值
Requiredstring 必填字符串校验器,要求必须有值且长度大于0,即不能是空字符串。默认会去掉字符串前后空格
参数fieldName:该参数指定校验的字段名称,如果是字段校验,则不用指定该参数
参数trim:该参数为可选参数,用于指定是否在校验之前对字符串进行整理。
Stringlength 字符串长度校验器,用于检验字段中字符串长度是否在指定的范围
参数 maxLength:用于指定最大字符串长度,该参数为可选
参数 minLength:用于指定最小字符串长度,该参数为可选
Int 整数校验器,可以配置整数在指定的范围内
参数 min:指定字段值的最小值,该参数为可选
参数 max:指定字段值的最大值,该参数为可选
Date 日期校验器,可以配置日期在指定的范围内
参数 min:指定字段日期值的最小值,该参数为可选
参数 max:指定字段日期值的最大值,该参数为可选
Email 邮件地址校验器,要求被检查的字段如果非空,则必须是合法的邮件地址。
Regex 检查是否能匹配到正则表达式,参数为regex
EqualTo 比较两个字段的值;常用于要求输入两次密码进行确认的情况
IPAddress 验证IPv4 网络地址
Length 验证输入字符串的长度
NumberRange 验证输入的值在数字范围内
Optional 无输入值时跳过其他验证函数
URL 验证URL
AnyOf 确保输入值在可选值列表中
NoneOf 确保输入值不在可选值列表中

5.3、自定义form标签

from wtforms.widgets import HTMLString, html_params
from wtforms import Field
class ButtonWidget(object): #自定义一个input组件
	def __call__(self,field,**kwargs):
		if field.name is not None:
			kwargs.setdefault("name",field.name)			
			kwargs.setdefault("type",field.btype)
			kwargs.setdefault('id',field.id)
			kwargs.setdefault("value",field.value)
			return HTMLString("<input %s>"%(html_params(**kwargs)))
class InputButtonField(Field):
	widget = ButtonWidget()
	"""
	@params value 按钮的标签
	@params text  按钮的文本
	"""
	def __init__(self,value="按钮",text="btn",btype="button",**kwargs):
		super(InputButtonField, self).__init__(**kwargs)
		self.type = "SubmitField"
		self.btype = btype
		self.value = value
		self.text = text

猜你喜欢

转载自blog.csdn.net/u011146423/article/details/84564637