Pylons 0.9.7 で validate 使用できる検証ルール



Pylons0.9.7ではFormEncodeのValidatorを使用して、
入力された値の検証を行ないます。

Validatorで使用できる検証ルールを調べてみました。

前提条件として、validatorsに用意されているルールは
api.FancyValidatorを継承して作成されています。
そのため、以下の設定はすべてのルールで使用できます。


【共通項項目】
■if_empty
入力値が空白の場合、if_emptyで指定した値に置き換えられます。

■not_empty
True:空白不可
False(デフォルト):空白許可

■strip
True:stripした値を返す
False(デフォルト):そのままの値を返す

■if_invalid
If set, then when this validator would raise Invalid during
``.to_python()``, instead return this value.

■if_invalid_python
If set, when the Python value (converted with
``.from_python()``) is invalid, this value will be returned.

■accept_python
If True (the default), then ``.validate_python()`` and
``.validate_other()`` will not be called when
``.from_python()`` is used.


validatorにより、検証を通過した値を取得するには、
self.form_result.get('document')

リクエストで送信された値を取得するには
request.params['document']

とします。

if_emptyを指定している場合は、self.form_result.get
を使用しないと、変換された値が取得できません。
※地味にこれではまりました。


これを踏まえて、validatorsで宣言されているクラスを見てみます。



【文字数の最大値を指定する】
formencode.validators.MaxLength

10文字以内に制限する場合
MaxLength(10)

※10文字を超えて入力した場合、
「長さ10文字以下で入力してください」(tooLong)

10文字以内、且つ空白不可に制限する場合
MaxLength(10,not_empty=True)

※空白の場合
「入力してください」(empty)



【文字数の最小値を指定する】
formencode.validators.MinLength

5文字以上に制限する場合
MinLength(5)

※5文字より少ない入力の場合
「長さ5文字以上で入力してください」(tooShort)



【空白不可とする】
formencode.validators.NotEmpty

空白不可とする場合
NotEmpty()

※空白の場合
「入力してください」(empty)



【入力不可とする】
formencode.validators.Empty

入力不可とする場合
Empty()

※入力された場合
「ここに入力しないでください」(notEmpty)



【正規表現による入力制限を行なう】
formencode.validators.Regex

英字大文字のみ入力可能とする場合
Regex(r'^[A-Z]+$')

※英字大文字以外が入力された場合
「入力が正しくありません」(invalid)


もちろん、空白不可のルールと組み合わせ可能です。
Regex(r'^[A-Z]+$',not_empty=True)



【英数字と下線(_)だけ入力を許可する】
formencode.validators.PlainText

英数字と下線(_)だけ入力を許可する場合
PlainText()

※空白などが入力された場合
「英数字と下線(_)だけ入力できます」(invalid)

Regex(r"^[a-zA-Z_\-0-9]*$")とメッセージが異なるだけです。



【リストで指定した内容だけ許可する】
formencode.validators.OneOf

1,2,3のいずれかのみ入力を許可する場合
OneOf(['1','2','3'])

型も比較対象なので、Pylonsで使用する場合にはリストの内容は
文字列で指定する必要があります。

※リスト以外が入力された場合
「1; 2; 3のいずれかでなければなりません(u'a')」(notIn)

「u'a'」となってしまうのが残念です。



【dictで指定した内容だけ許可する】
formencode.validators.DictConverter

1,2,3のいずれかのみ入力を許可し、one,two,threeに変換する場合
DictConverter({'1': 'one', '2': 'two','3':'three'})

1が入力された場合、
self.form_result.get('document')は'one'
request.params['document']は'1'を返します。

※dictのkey以外が入力された場合
「'1'; '3'; '2'から選んでください」(chooseKey)



【リストに含まれている数の範囲の入力だけ許可する】
formencode.validators.IndexListConverter

リストの最大値の範囲だけ入力を許可し、該当するインデックスの
値に変換します。
IndexListConverter(['zero','one','two'])

この場合
0が入力されると'zero'
2が入力されると'two'
3が入力されると「範囲外の値です」(outOfRange)
-1が入力されると'two'
-3が入力されると'zero'
-4が入力されると「範囲外の値です」(outOfRange)
aが入力されると「数値で指定してください」(integer)
という動きになります。




もどる