WTForms 是一個flask集成框架,或者說是庫,用於處理瀏覽器表單提交的數據,它在flask-WTF的基礎上擴展並添加了一些隨手可得的精巧幫助函數,這些函數將會是在flask裏使用表單更加有趣.python
用法:正則表達式
WTForms支持HTML字段flask
字段類型 | 說明 |
StringField | 文本字段,至關於type類型爲text的input標籤 |
TextAreaField | 多行文本字段 |
PasswordField | 密碼文本字段 |
HiddenField | 隱藏文本字段 |
DateField | 文本字段, 值爲datetime.date格式 |
DateTimeField | 文本字段, 值爲datetime.datetime格式 |
IntegerField | 文本字段, 值爲整數 |
DecimalField | 文本字段, 值爲decimal.Decimal |
FloatField | 文本字段, 值爲浮點數 |
BooleanField | 複選框, 值爲True 和 False |
RadioField | 一組單選框 |
SelectField | 下拉列表 |
SelectMultipleField | 下拉列表, 可選擇多個值 |
FileField | 文件上傳字段 |
SubmitField | 表單提交按鈕 |
FormFiled | 把表單做爲字段嵌入另外一個表單 |
FieldList | 子組指定類型的字段 |
WTForms能夠支持不少表單的驗證函數:瀏覽器
驗證函數 | 說明 |
驗證電子郵件地址 | |
EqualTo | 比較兩個字段的值;經常使用於要求輸入兩次祕鑰進行確認的狀況 |
IPAddress | 驗證IPv4網絡地址 |
Length | 驗證輸入字符串的長度 |
NumberRange | 驗證輸入的值在數字範圍內 |
Optional | 無輸入值時跳過其餘驗證函數 |
DateRequired | 確保字段中有數據 |
Regexp | 使用正則表達式驗證輸入值 |
URL | 驗證URL |
AnyOf | 確保輸入值在可選值列表中 |
NoneOf | 確保輸入值不在可選列表中 |
第一種:in-line validator(內聯驗證器)網絡
也就是自定義一個驗證函數,在定義表單類的時候,在對應的字段中加入該函數進行認證.下面的my_length_check函數就是用於判斷name字段長度不能超過50框架
def my_length_check(form, field): if len(field.data) > 50: raise ValidationError('Field must be less than 50 characters') class MyForm(Form): name = StringField('Name', [InputRequired(), my_length_check])
第二種:通用且可重用的驗證函數less
通常是以validate開頭,加上下劃線在加上對應的field字段(validate_field),瀏覽器在提交表單數據時,會自動識別對應字段全部的驗證器,而後執行驗證器進行判斷.函數
class RegistrationForm(FlaskForm): email = StringField('Email', validators=[DataRequired(), Length(1, 60), Email()]) username = StringField('Username', validators=[DataRequired(), Length(1, 60), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0, 'username must have only letters, numbers dots or underscores')]) password = PasswordField('Password', validators=[DataRequired(), EqualTo('password2', message='password must match')]) password2 = PasswordField('Confirm password', validators=[DataRequired()]) def validate_email(self, field): if User.objects.filter(email=field.data).count() > 0: raise ValidationError('Email already registered') def validate_username(self, field): if User.objects.filter(username=field.data).count() > 0: raise ValidationError('Username has exist')
第三種:比較高級的validatorsui
class Length(object): def __init__(self, min=-1, max=-1, message=None): self.min = min self.max = max if not message: message = u'Field must be between %i and %i characters long.' % (min, max) self.message = message def __call__(self, form, field): l = field.data and len(field.data) or 0 if l < self.min or self.max != -1 and l > self.max: raise ValidationError(self.message) length = Length
下面能夠以登陸界面爲實例:spa
login.py
#!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, render_template, request, redirect from wtforms import Form from wtforms import validators from wtforms import widgets class LoginForm(Form): name = simple.StringField( label='用戶名', validators=[ validators.DataRequired(message='用戶名不能爲空.'), ], widget=widgets.TextInput(), render_kw={'class': 'form-control'} ) pwd = simple.PasswordField( label='密碼', validators=[ validators.DataRequired(message='密碼不能爲空.'), ], widget=widgets.PasswordInput(), render_kw={'class': 'form-control'} )