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

2013年06月14日

前回までで、The WSGI applicationが終了し(1ページで3回もかかりましたが。。)今回からは、次の項目の、URI routingに入ります。

URI routing 

URI routingは、main.pyなどでリクエストに対して、どのhandlerを割り当てるかなどを設定する部分です。

以下の様な記載をする部分です。

app = webapp2.WSGIApplication([
 (r'/', HomeHandler),
])

webapp2では、webapp(python2.5)での記述を引き継ぎつつ、新しい協力な機能が追加されています。

Simple routes 

この機能は、一番シンプルな記載で、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側でパラメータとして受け取ることができます。

ProductHandlerdef get のパラメータのproduct_idの部分が受取側の記載です。

どれにも一致しないリクエストを受けた場合には、webapp2が404を返す仕組みになっています。 

404が発生した場合のハンドリングの仕方は、webapp2公式ドキュメントを読み解く会(2回目)の「3.Error handlers」の項目でも紹介しています。

サンプルソースのhandlerの記載では、各handlerをimportしておく必要があります。

handerをパッケージからフルパスで指定し、文字列として記載することでimportしないで記載することもできます。

 

Extended routes

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の強力な機能を利用することが出来るというわけです。

 

今回は以上です。

次回は、これらの強力な機能について読んでいきます。

 



PAGE TOP