webapp2公式ドキュメントを読み解く会(6回目)

2013年07月05日

webapp2の公式ドキュメントを読む会もとうとう6回目になりました。

今回で、やっとURL routingが終了です。

Path prefix routes

何度も同じ記述を避けるための記載方法です。

リクエストをグループ化して定義する事ができるようになります。

 

app = WSGIApplication([
    Route('/users/<user:\w+>/', UserOverviewHandler, 'user-overview'),
    Route('/users/<user:\w+>/profile', UserProfileHandler, 'user-profile'),
    Route('/users/<user:\w+>/projects', UserProjectsHandler, 'user-projects'),
])



import webapp2
from webapp2_extras import routes

app = WSGIApplication([
    routes.PathPrefixRoute('/users/<user:\w+>', [
        webapp2.Route('/', UserOverviewHandler, 'user-overview'),
        webapp2.Route('/profile', UserProfileHandler, 'user-profile'),
        webapp2.Route('/projects', UserProjectsHandler, 'user-projects'),
    ]),
])

PathPrefixRouteは、記載の仕方だけでなく、処理効率も上がるそうです。

通常は、定義されたRouteを順番にマッチングしながら処理を行うのですが、PathPrefixRouteに一致しなかった場合は、全てスキップするため無駄なマッチングをせずに済むようです。

 

Other prefix routes

上記のPathPrefixRouteと似たprefixとして、HandlerPrefixRouteとNamePrefixRouteも用意されています。

PathPrefixRouteが、パスをまとめて記載するのに対して、

HandlerPrefixRouteは、handlerをNamePrefixRouteは、nameをまとめることが出来る機能です。

HandlerPrefixRouteは、既出のLazy handlersの記載をした場合にhandlerのパスをまとめることが出来ます。

NamePrefixRouteは、次の項目で説明されているnameの記載をまとめることが出来ます。

詳細は、こちらを参考にするといいと思います。Extra routes

 

ちなみに、特に処理効率が上がる等の効果は期待できそうにありません。観やすい記述にするという効果になります。

また、PathPrefixRoute、HandlerPrefixRoute、NamePrefixRouteを一緒に使うには、ネストさせて記述するしかなさそうなので、処理効率の改善を期待できるPathPrefixRouteを優先して使うのがお薦めです。

 

Building URIs

今までと少し、変わった機能です。

これまでもサンプルソースの中では、以下の様にnameというパラメータが設定されていました。

webapp2.Route(r'/', handler=HomeHandler, name='home'),

これまで、特別説明がされてこなかったのですが、ここで使い方が紹介されています。

簡単に説明すると各Routeにnameを付けて、handlerなどアプリケーション側でurlを生成する際に利用します。

通常、サイト内リンク等もハードコーディングしがちですが、URLを変更した際に全て変更しなければいけなくなり、とても面倒な作用になることがあります。

本番に入ってからURLを変更することは少ないかもしれませんが、開発中のアプリケーションでは変更したくなることが稀にあると思います。

 

そんな時に、Routeの設定を変更するだけで生成されるURLが変更出来るのはとても便利な機能ですね。

 

以下は、公式サイトのサンプルソースです。

app = webapp2.WSGIApplication([
    webapp2.Route('/', handler='handlers.HomeHandler', name='home'),
    webapp2.Route('/wiki', handler=WikiHandler, name='wiki'),
    webapp2.Route('/wiki/<page>', handler=WikiHandler, name='wiki-page'),
])
# /
uri = uri_for('home')
# http://localhost:8080/
uri = uri_for('home', _full=True)
# /wiki
uri = uri_for('wiki')
# http://localhost:8080/wiki
uri = uri_for('wiki', _full=True)
# http://localhost:8080/wiki#my-heading
uri = uri_for('wiki', _full=True, _fragment='my-heading')
# /wiki/my-first-page
uri = uri_for('wiki-page', page='my-first-page')
# /wiki/my-first-page?format=atom
uri = uri_for('wiki-page', page='my-first-page', format='atom')

1つ目:ルートのURLが返ります。

2つ目:_fullのパラメータを設定することで、ドメインを含めたURLが返ります。

3つ目:wikiのURLが返ります。

4つ目:_fullのパラメータを設定することで、wikiのドメインを含めたURLが返ります。

5つ目:_fragmentを設定することで、タグ付きのURLが返ります。

6つ目:pageを設定することで、Routeに設定したに値を当てはめたURLが返ります。

7つ目:formatの様に、Routeに設定されていない場合は、パラメータ付きのURLが返ります。

 

Routing attributes in the request object

これらのRoutingの設定内容は、requestオブジェクトに含まれるため、handlerなどでも取得することが出来ます。 

 



PAGE TOP