flask web 表單驗證 WTForms

簡介

WTForms 是一個flask集成框架,或者說是庫,用於處理瀏覽器表單提交的數據,它在flask-WTF的基礎上擴展並添加了一些隨手可得的精巧幫助函數,這些函數將會是在flask裏使用表單更加有趣.python

用法:正則表達式

1.field字段

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  子組指定類型的字段

 2.Validators驗證器

WTForms能夠支持不少表單的驗證函數:瀏覽器

驗證函數 說明
Email 驗證電子郵件地址
EqualTo 比較兩個字段的值;經常使用於要求輸入兩次祕鑰進行確認的狀況
IPAddress 驗證IPv4網絡地址
Length 驗證輸入字符串的長度
NumberRange 驗證輸入的值在數字範圍內
Optional 無輸入值時跳過其餘驗證函數
DateRequired 確保字段中有數據
Regexp 使用正則表達式驗證輸入值
URL 驗證URL
AnyOf 確保輸入值在可選值列表中
NoneOf 確保輸入值不在可選列表中

3.自定義Validators驗證器

第一種: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

4.widget組件

下面能夠以登陸界面爲實例: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'}
    )

 

轉自:https://www.jianshu.com/p/7e16877757f8

相關文章
相關標籤/搜索