WtForms validators表單驗證
本文只是個人學習所做,有些地方根據英語來不是很通順,想看原文,請參考 Validators
Validators簡介
Validators是一個可以很輕鬆的實現諸如輸入字元長度等的驗證器,當驗證失敗的時候呼叫ValidationError。這個模組非常的簡單、靈活,並且允許你在filed中新增任意多個驗證器。
當驗證失敗的時候將會呼叫ValidationError,
Class wtforms.validators.ValidationError(message=u'', *args, **kwargs)
Class wtforms.validators.StopValidation(message=u''
當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(fieldname, message=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=True, ipv6=False, message=None)
ipv4-當為Ture時,允許有效的IPv4地址(預設為True)
ipv6-當為Ture時,允許有效的IPv6地址(預設為False)
引數:message-當驗證失敗時返回的錯誤訊息
class wtforms.validators.Length(min=-1, max=-1,message=None)
驗證字串的長度
min-輸入的最小的字串長度,如果未指定,則不校驗最小字串
max-輸入的最大的字串長度,如果未指定,則不校驗最大字串
message-當驗證失敗時返回的錯誤訊息,如果需要,可以通過%(min)d,%(max)d來自行設定
class wtforms.validators.MacAddress(message=None)
驗證MAC地址
message-當驗證失敗時返回的錯誤訊息
class wtforms.validators.NumberRange(min=None, max=None,message=None)
用於驗證資料是否在最小值與最大值之間,支援的常用的資料型別,如float等,不只是int
min-輸入的最小的字串長度,如果未指定,則不校驗最小字串
max-輸入的最大的字串長度,如果未指定,則不校驗最大字串
message-當驗證失敗時返回的錯誤訊息,如果需要,可以通過%(min)d,%(max)d來自行設定
class wtforms.validators.Regexp(regex, flags=0, message=None)
通過正則表示式驗證
regex-正則表示式,也可以通過引數傳遞
flags-regex使用標示,如re.IGNORECASE,如果regex不是一個字串將忽略
message-當驗證失敗時返回的錯誤訊息
class wtforms.validators.URL(require_tld=True, message=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 |