引数を使いたい!

CherryPy(とTurboGears)をおもしろくさせているのは、ウェブからのリクエストと一緒にやってくるパラメータがメソッドのパラメータに自動的に渡される点です。これはウェブリクエストをできるだけ自然にハンドリングさせてくれます。

たとえばこんなルートクラスを考えてみましょう:

class Root:
    @expose()
    def index(self, name="Arthur"):
        return "I am %s, King of the Britons" % name

"/"にアクセスして"I am Arthur, King of the Britons"と表示されても特段驚くことはないでしょう。デフォルトの引数は期待したように正確に動作したはずです。そしておそらくリクエストのパラメータもあなたの期待通りに動作するのではないかと思います。"/?name=Lancelot"にアクセスすると、"I am Lancelot, King of the Britons"と出力されましたね。

Pythonと同じように、"/?foobar=baz"を呼ぶとroot.index(foobar="baz")を呼ぼうとするので例外が起こります。しかしウェブ上では"500"の例外エラーが、URLのミスタイプやパラメータのためにいちいち発生するのは不格好です。そこでtg.strict_parametersという設定オプションがあります。これは開発環境ではデフォルトで有効に、プロダクション環境では無効に設定されます。

もしウェブからのパラメータすべてをハンドリングしたいのであれば、Pythonと同じように以下のようにすれば可能です:

class Root:
    @expose()
    def index(self, name="Arthur", **kw):
        return "I am %s, King of the Britons" % name

Pythonと同じように、kwは要求された引数の残りすべてを保持する辞書となります。

Previous: CherryPyを使う : Next: モデルを定義する