はじめに
第1回では「Hello, world.」を出力する簡単なアプリケーションを作成し,WSGIの仕様について説明しました。
しかし,「Hello, world.」のような簡単なアプリケーションからは,実際に作成するアプリケーションの雰囲気のを掴むのは難しいと思いますので,第2回では,もう少し実用的なアプリケーションを例にして,解説をしたいと思います。
MessageBoardアプリケーション
今回作成するアプリケーションは,MessageBoardアプリケーションです。フォームからタイトル,名前,本文を入力して投稿すると,それまでに投稿されたメッセージが一覧される掲示板のようなアプリケーションです。
アプリケーションのソースコードはこちらにZIP圧縮版があります。まずは,ダウンロードして以下のように実行してみてください。
サンプルソースmessage.pyで,マルチバイト文字を書き込んだ際に文字コードまわりでエラーが発生することがわかりました。これを修正したものに差し替えました。(2008/8/21)
具体的な修正箇所は,以下のとおりです。
- listMessagesで文字をエスケープする際のUnicodeへの変換処理で,変換エラーを無視するようにした
- listMessagesで出力するHTMLにmetaタグでcharsetを指定した
- listMessagesの HTTPレスポンスヘッダのContent-type に charset=utf-8を追加した
- listMessagesで出力しているformタグにAcceptEncoding="utf-8"を追加した
上記修正に伴い,記事中の「リスト4」の内容も変更になっています。
$ python message.py
message.pyを実行し,http://localhost:8080/にブラウザでアクセスすると,図1のようにメッセージを入力するフォームが表示されます。
フォームに名前,タイトル,本文を入力して「post」すると,書き込みフォームの上部に書き込まれたメッセージが図2のように新しい順に表示されます。
今回は,このようなメッセージボードアプリケーションを例として使用します。
ソースの内容
前回のHello, world.アプリケーションでは1つの関数を定義していましたが,今回は1つのクラスを定義しています。定義したクラスでは,__call__というメソッドが定義されています。
特殊メソッド
__call__のようにメソッド名の前後にアンダースコアが2つ付いているメソッドは,Pythonでは特殊メソッドと呼ばれます。
特殊メソッドを定義することで,ユーザ定義のクラスに組み込みオブジェクトのような振る舞いをさせることができます(特殊メソッドの詳細はPythonリファレンスマニュアルをご参照ください)。
__call__が定義されたクラスのインスタンスは,リスト1のように関数と同様に呼び出すことができます。そのため,クラスのインスタンスであっても,WSGIアプリケーションとして使用可能です。
__call__と同じように定義されている__init__はクラスのコンストラクタで,インスタンス生成時に呼ばれます。
リスト1 __call__の呼び出し
>>> instance = someclass() # __call__ メソッドを持ったsomeclass クラスのインスタンスを作成
>>> instance(argument) # instance.__call__(argument) と等価な処理

