1. 程式人生 > >WtForms validators表單驗證

WtForms validators表單驗證

本文只是個人學習所做,有些地方根據英語來不是很通順,想看原文,請參考  Validators

Validators簡介

Validators是一個可以很輕鬆的實現諸如輸入字元長度等的驗證器,當驗證失敗的時候呼叫ValidationError。這個模組非常的簡單、靈活,並且允許你在filed中新增任意多個驗證器。

當驗證失敗的時候將會呼叫ValidationError,

Class  wtforms.validators.ValidationError(message=u''*args**kwargs)

Class  wtforms.validators.StopValidation(message=u''

*args**kwargs)

當StopValidation被呼叫時將會引起對驗證鏈的中斷,不會在進行後續的驗證,如果是被一個訊息所引起,那麼這個訊息將會被新增到錯誤列表中。

內建的驗證器

Class  wtforms.validators.DataRequired(message=None)

此驗證器將會檢測field是否輸入了數值,實際上是進行了if field.data操作。並且,如數資料是一個字串,那麼只包含空格的字串將會被認為是False。

class  wtforms.validators.Email(message=None)

此驗證器驗證Email的地址,注意只會驗證Email的格式,最好在使用的時候你能夠自己校驗他的真實性,比如啟用或者查詢

引數:message-當驗證失敗時返回的錯誤訊息驗證失敗時返回的錯誤訊息

class wtforms.validators.EqualTo(fieldnamemessage=None)

用於比較兩個Field的資料是否相等。

引數:     filedname-你要比較的另一個Field的名稱

message-當驗證失敗時返回的錯誤訊息,可以用%(other_label)s和 %(other_name)s來更提供更多的錯誤訊息

此驗證器可用於驗證一個或者多個相同field的情景,更改密碼的程式碼

class ChangePassword(Form):

    password = PasswordField('NewPassword', [InputRequired(), EqualTo('confirm', message='Passwords must match')])

    confirm  = PasswordField('Repeat Password')

在此例子中,用IputRequired驗證器來防止EqualTo驗證器來匹配密碼當password為空的時候,當InputRequired為空的時候就會停止驗證。

class  wtforms.validators.InputRequired(message=None)

用於驗證field有資料輸入,注意與DataRequired的區別,InputRequired主要看是否輸入了資料,而DataRequired用於那些強制Post的資料

class wtforms.validators.IPAddress(ipv4=Trueipv6=Falsemessage=None)

ipv4-當為Ture時,允許有效的IPv4地址(預設為True)

ipv6-當為Ture時,允許有效的IPv6地址(預設為False)

引數:message-當驗證失敗時返回的錯誤訊息

class  wtforms.validators.Length(min=-1max=-1,message=None)

驗證字串的長度

min-輸入的最小的字串長度,如果未指定,則不校驗最小字串

max-輸入的最大的字串長度,如果未指定,則不校驗最大字串

message-當驗證失敗時返回的錯誤訊息,如果需要,可以通過%(min)d,%(max)d來自行設定

class  wtforms.validators.MacAddress(message=None)

驗證MAC地址

message-當驗證失敗時返回的錯誤訊息

class  wtforms.validators.NumberRange(min=Nonemax=None,message=None)

用於驗證資料是否在最小值與最大值之間,支援的常用的資料型別,如float等,不只是int

min-輸入的最小的字串長度,如果未指定,則不校驗最小字串

max-輸入的最大的字串長度,如果未指定,則不校驗最大字串

message-當驗證失敗時返回的錯誤訊息,如果需要,可以通過%(min)d,%(max)d來自行設定

class  wtforms.validators.Regexp(regexflags=0message=None)

通過正則表示式驗證

regex-正則表示式,也可以通過引數傳遞

flags-regex使用標示,如re.IGNORECASE,如果regex不是一個字串將忽略

message-當驗證失敗時返回的錯誤訊息

class  wtforms.validators.URL(require_tld=Truemessage=None)

通過正則表示式對URL進行簡單的驗證,與Email驗證器相似,可能在之後需要其他的方式驗證其真實性

require_tld-當設定為True時,必須在域名中包含頂級域名等,當需要驗證localhost時設定為False

自定義驗證器

開始做一個可複用的驗證器,簡單的namefield驗證器

class MyForm(Form):

    name = StringField('Name', [InputRequired()])

    def validate_name(form, field):

        if len(field.data) > 50:

            raise ValidationError('Name must be less than 50 characters')

我們可以將函式放在類中,也可以將函式放在類外任何可以呼叫到函式的地方,如下:

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])

我們也可以通過建立一個工廠來讓驗證器更強大

def length(min=-1, max=-1):

    message = 'Must be between %d and %d characters long.' % (min, max)

    def _length(form, field):

        l = field.data and len(field.data) or 0

        if l < min or max != -1 and l > max:

            raise ValidationError(message)

    return _length

class MyForm(Form):

    name = StringField('Name', [InputRequired(), length(max=50)])

現在我們建立了一個可控制長度的字串長度驗證器,下面我們將驗證器做的可複用性更高,並且讓使用者可以自定義自己的錯誤訊息:

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 %icharacters 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