webapp2公式ドキュメントを読み解く会(6回目)
2013年07月05日
webapp2の公式ドキュメントを読む会もとうとう6回目になりました。
今回で、やっとURL routingが終了です。
何度も同じ記述を避けるための記載方法です。
リクエストをグループ化して定義する事ができるようになります。
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に一致しなかった場合は、全てスキップするため無駄なマッチングをせずに済むようです。
上記のPathPrefixRouteと似たprefixとして、HandlerPrefixRouteとNamePrefixRouteも用意されています。
PathPrefixRouteが、パスをまとめて記載するのに対して、
HandlerPrefixRouteは、handlerをNamePrefixRouteは、nameをまとめることが出来る機能です。
HandlerPrefixRouteは、既出のLazy handlersの記載をした場合にhandlerのパスをまとめることが出来ます。
NamePrefixRouteは、次の項目で説明されているnameの記載をまとめることが出来ます。
詳細は、こちらを参考にするといいと思います。Extra routes
ちなみに、特に処理効率が上がる等の効果は期待できそうにありません。観やすい記述にするという効果になります。
また、PathPrefixRoute、HandlerPrefixRoute、NamePrefixRouteを一緒に使うには、ネストさせて記述するしかなさそうなので、処理効率の改善を期待できるPathPrefixRouteを優先して使うのがお薦めです。
今までと少し、変わった機能です。
これまでもサンプルソースの中では、以下の様に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などでも取得することが出来ます。