flask web 表單驗證 WTForms


簡介

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

用法:

1.field字段

WTForms支持HTML字段

 
字段類型 說明
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])

 

第二種:通用且可重用的驗證函數

一般是以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')

 

第三種:比較高級的validators

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組件

下面可以以登錄界面為實例:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM