Djangoでの入力フォームのバリデーション
年明けから、ようやくPythonを始める時間が取れて、Google App Engineにも採用されているDjangoを使ってみることにした。言語もフレームワークもどっちも知らないって状態から、両方を調べながらサンプルアプリケーションを作ってみては、色々と試行錯誤しているので、すごく時間がかかっている。もしかしたら、かなり突拍子もない実装をしているのかもしれない。で、手を動かして考えてみたけど、Djangoは良く考えられてるなと思った。今日のエントリーはその過程で考えてみたバリデーション方法について。
前フリ
DjangoにはFormというのがあって、
- 入力フィールドのhtmlタグへの変換
- 入力値のバリデーション(ならびに、エラー文字列の表示と、DBでのデータ型の取得)
- 入力値の受け渡し
- 入力値の保存
あたりの機能をカプセル化している。ここでのバリデーションを、「requestの事前処理」という見方をすると、これってアスペクトか?と思えてきたので、あとはそのルールをどの入力フィールドに適用するか、という観点で実装したのが以下のソース。ここではPythonのデコレータを使っている。Pythonのデコレータの書き方は、.NETのAttributeとかJavaのAnnotationと書き方が似ているけど、中身は別物(のはず)。とりあえず、簡単そうな例として、必須入力フィールドの検証を載せてみる。
で、view関数では以下のようにして使う。
Formを使う場合にはrequest.methodがGETかPOSTかで関数内の処理を分けるのがマナーらしいが、サンプルではgetの場合、postの場合としていたので、上の例ではpost時のview関数のみを載せた。main.htmlに表示しているのは、以下の2つ。
- username
- tel
それぞれが必須入力項目とした場合に、その検証結果を表示するという内容。
まとめ
作ってみたはいいものの、Formを使った方がコードがすっきりしたので、Djangoではあまり使い道がないのかもしれない。ただし、Formだけでうまくいかない事があれば使う場合も出てくるかもしれないし、むしろwebじゃない場合の検証の実装方法としてはありなのかも、と思った。あるいはクエリ文字列の検証とか。
後で、もう少しきれいにしておきたい気がする。