webapp2公式ドキュメントを読み解く会(4回目)
2013年06月14日
前回までで、The WSGI applicationが終了し(1ページで3回もかかりましたが。。)今回からは、次の項目の、URI routingに入ります。
URI routingは、main.pyなどでリクエストに対して、どのhandlerを割り当てるかなどを設定する部分です。
以下の様な記載をする部分です。
app = webapp2.WSGIApplication([ (r'/', HomeHandler), ])
webapp2では、webapp(python2.5)での記述を引き継ぎつつ、新しい協力な機能が追加されています。
この機能は、一番シンプルな記載で、webappから引き継がれている記載方法です。
タプルで(url,handler)の形式で記載します。
以下は、公式サイトにサンプルとして紹介されているソースです。
class HomeHandler(webapp2.RequestHandler):
def get(self):
self.response.write('This is the HomeHandler.')
class ProductListHandler(webapp2.RequestHandler):
def get(self):
self.response.write('This is the ProductListHandler.')
class ProductHandler(webapp2.RequestHandler):
def get(self, product_id):
self.response.write('This is the ProductHandler. '
'The product id is %s' % product_id)
app = webapp2.WSGIApplication([
(r'/', HomeHandler),
(r'/products', ProductListHandler),
(r'/products/(\d+)', ProductHandler),
])
サンプルソースの3番目の記載の通り、正規表現を利用することが可能です。
正規表現を設定した項目は、handler側でパラメータとして受け取ることができます。
ProductHandler の def get のパラメータのproduct_idの部分が受取側の記載です。
どれにも一致しないリクエストを受けた場合には、webapp2が404を返す仕組みになっています。
404が発生した場合のハンドリングの仕方は、webapp2公式ドキュメントを読み解く会(2回目)の「3.Error handlers」の項目でも紹介しています。
サンプルソースのhandlerの記載では、各handlerをimportしておく必要があります。
handerをパッケージからフルパスで指定し、文字列として記載することでimportしないで記載することもできます。
webapp2で追加された強力な機能です。
以下は、公式サイトにサンプルとして紹介されているソースです。
app = webapp2.WSGIApplication([
webapp2.Route(r'/', handler=HomeHandler, name='home'),
webapp2.Route(r'/products', handler=ProductListHandler, name='product-list'),
webapp2.Route(r'/products/<product_id:\d+>', handler=ProductHandler, name='product'),
])
Extended routesでは、以下の機能が強力になっているようです。
- URI building:
正直、記載していることはあまり理解出来ませんでしたが、template機能など後の項目で説明している機能を利用することで、よりURIのマッピングが簡単に記載できるようになり、エラーの発生やメンテナンスの手間を減らすことが出来る。 - Keyword arguments
simple routesで、正規表現を指定した場合にもhandler側でパラメータとして受け取る事が出来ましたが、Keyword argumentsで受け取ることができる機能が追加されています。
サンプルソースの3つ目の記載がこれに当たります。これは、templateという後の項目で説明する機能を使用しています。 - Nested routes
リクエストを受け取る際にさらなる拡張が出来るようです。ドメインやサブドメイン等の判断も出来るようになります。
この後の項目で、これらの機能の一部が紹介されています。
詳細は、APIリファレンスの webapp2.Route.__init__() をチェックする必要があります。
パラメータだけ紹介すると以下のようになっています。
__init__(template, handler=None, name=None, defaults=None, build_only=False, handler_method=None, methods=None, schemes=None)
これらの個々のパラメータの意味を理解すると、webapp2の強力な機能を利用することが出来るというわけです。
今回は以上です。
次回は、これらの強力な機能について読んでいきます。