CherryPyを使う

CherryPyでは、ウェブサイトはオブジェクトやメソッドのツリーとして表現されます。CherryPyでアプリケーションがセットアップされる方法は、リクエストがシステムを通じてどのように到達点に達するのかを考えれば簡単です。CherryPyはリクエストをどこから始めればよいのかをどうやって知るのでしょう?これはcherrypy.rootから始めるのです。

start-gs.pyを見ると以下のものが見えるでしょう:

from gs.controllers import Root

cherrypy.root = Root()

ルートコントローラクラスは "Root" と呼ばれ、これはプロジェクトパッケージの "controllers.py" モジュールの中にあります。小さなアプリケーションでは、コントローラモジュールは一つでよいでしょう。しかしより大きなプロジェクトではアプリケーションをいくつかに分割したいと思うかもしれません。分割したとしても、一カ所からすべてを利用できるように、様々なパッケージからコントローラをimportすることはできます。

yourpackage.controllers.Rootがアプリケーションのルートオブジェクトである限り、準備はできています。

URLの検索がコントローラの走査によってどのように行われるのかを確認するために、いくつかの実験用クラスを作ってみましょう:

from turbogears import expose

class HardCodedAddition:

    def cantgohere(self):
        pass

    @expose()
    def twoplustwo(self):
        return "four"

    @expose()
    def fortyplus(self, number):
        return "40 + %s = %s" % (number, 40 + int(number))

class AlwaysSeven:

    @expose()
    def index(self):
        return "7"

class Never404:

    @expose()
    def default(self, *args):
        return "The next parts were %s" % str(args)

class Root:

    seven = AlwaysSeven()

    add = HardCodedAddition()

    foobar = Never404()

    @expose()
    def index(self):
        return "Welcome"

    @expose()
    def fun(self):
        return "...and yet startlingly productive"

これらによって、TurboGearsにおいてどのようにURLの走査が行われるのかを簡単に見ることができます。TurboGearsを抜きにしてもCherryPyは同じルールで動作します。

URL path What you see Notes
/ Welcome 他に何も与えられなければindexメソッドが実行される
/fun ...and yet startlingly productive メソッドがマッチすればそれが実行される
/seven Redirect to /seven/ サブオブジェクトはディレクトリのように扱われるので スラッシュ付きのものへリダイレクトされる。 これは相対的なURLが有効かどうか確認する意味で 良いことである
/seven/ 7 indexメソッドのサブオブジェクトが実行される
/add/cantgohere Error! このメソッドはexposedではない。CherryPyはexposedなメソッドだけを公開する
/add/twoplustwo four メソッドのサブオブジェクトを実行する
/add/fortyplus/5 40 + 5 = 45 位置パラメータはコントローラに引数を 追加することで簡単に追加できる
/foobar The next parts were () マッチするものがない場合は defaultメソッドが呼ばれる (存在していれば)
/foobar/baz/bork The next parts were ('baz', 'bork') URLの残りの部分は分割され、 defaultメソッドへ引数として 渡される

あなたがオブジェクトツリーを構築するのに必要な位置パラメータとdefaultメソッドを考えると、URLがヒットしたときに何が起きるのかを決定する意味がわかると思います。

Previous: 基本的な設定 : Next: 引数を使いたい!