route とビューのサンプル

これは、最も一般的な種類の route とビューです。

  1. 固定のコントローラーとアクション。

    1
    2
    3
    4
    5
    # Pylons
    map.connect("faq", "/help/faq", controller="help", action="faq")
    class HelpController(Base):
        def faq(self):
            ...
    
    1
    2
    3
    4
    5
    # Pyramid
    config.add_route("faq", "/help/faq")
    @view_config(route_name="faq", renderer="...")
    def faq(self):   # In some arbitrary class.
        ...
    

    .

  1. 固定のコントローラとアクション、加えて他のルーティング変数。

    1
    2
    3
    4
    5
    6
    # Pylons
    map.connect("article", "/article/{id}", controller="foo",
        action="article")
    class FooController(Base):
        def article(self, id):
            ...
    
    1
    2
    3
    4
    5
    # Pyramid
    config.add_route("article", "/article/{id}")
    @view_config(route_name="article")
    def article(self):   # In some arbitrary class.
        id = self.request.matchdict["id"]
    

    .

  1. 可変のコントローラとアクション。

    # Pylons
    map.connect("/{controller}/{action}")
    map.connect("/{controller/{action}/{id}")
    
    # Pyramid
    # Not possible.
    

    Pyramid ではルーティング変数によってビュークラスを選択することは できません。

  1. 固定のコントローラ、可変のアクション。

    # Pylons
    map.connect("help", "/help/{action}", controller="help")
    
    1
    2
    3
    4
    5
    6
    # Pyramid
    config.add_route("help", "/help/{action}")
    
    @view_config(route_name="help", match_param="action=help", ...)
    def help(self):   # In some arbitrary class.
        ...
    

    ‘pyramid_handlers’ パッケージはこれとは別の選択肢を提供します。

他の Pyramid の例:

1
2
3
4
5
6
# Home route.
config.add_route("home", "/")

# Multi-action route, excluding certain static URLs.
config.add_route("main", "/{action}",
    path_info=r"/(?!favicon\.ico|robots\.txt|w3c)")

pyramid_handlers

pyramid_handlers” は、上記のケース #4 を扱うためのおそらくより便利な 方法 (ビューを指定する ‘action’ 変数を含んだ route) を提供するアドオン パッケージです。それはこのように作動します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
    # In the top-level __init__.py
    from .handlers import Hello
    def main(global_config, **settings):
        ...
        config.include("pyramid_handlers")
        config.add_handler("hello", "/hello/{action}", handler=Hello) 

    # In zzz/handlers.py
    from pyramid_handlers import action
    class Hello(object):
        __autoexpose__ = None

        def __init__(self, request):
            self.request = request

        @action
        def index(self):
            return Response('Hello world!')

        @action(renderer="mytemplate.mak")
        def bye(self):
            return {}

add_handler メソッド (6行目) は、 route を登録し、次に Hello クラス を走査します。それは @action デコレータを持つすべてのメソッドを、 メソッド名をビュー述語として使用してビューとして登録します。その結果、 メソッド名が URL の ‘action’ 部分に現われた場合、 Pyramid はこのビュー を呼び出します。

__autoexpose__ クラス属性 (11行目) は正規表現にすることも可能です。 任意のメソッド名がそれと一致すれば、 @action デコレータがなくても ビューとして登録されます。デフォルトの自動 expose 正規表現は英文字から 始まるすべてのメソッドとマッチします。したがって、メソッドが自動的に expose されるのを避けるためには、それを None に設定しなければなりません。 もしそうしたければ、ベースクラスの中でこれをすることができます。

@action デコレータは config.scan() によって認識 されない ことに 注意してください。 @action デコレータは config.add_hander でのみ動作します。

“pyramid_handlers” に対するユーザの反応は様々です。一部のユーザはそれを 使っています。しかし、ほとんどのユーザはそれが「標準の Pyramid 」だから という理由で @view_config を使っています。

リソース route

pyramid_routehelper” は、 Pylons の map.resource のように動作する config.add_resource メソッドを提供します。それは、 RESTful なやり方 で (Atom publishing protocol に従って) リソースを一覧/表示/追加/修正/削 除する route 一式を加えます。詳細については、リンク先のソースコードの docstring を参照してください。

注: ここでの単語「リソース」はトラバーサルのリソースとは関係 ありません

Table Of Contents

Previous topic

ビュー

Next topic

リクエストとレスポンス