webapp2公式ドキュメントを読み解く会(2回目)
2013年05月29日
今週も横浜のコワーキングスペース「タネマキ」で、GAE/Pを中心とした勉強会を実施しました。今回も2名でした。
先週に引き続き、前半はwebapp2公式ドキュメントを読み解く会を実施しました。
今回は、Config,Registry,Error handlersの部分です。
いつも通り、英語は殆ど分からないので、読解力にはかなりの不安があります。。
- Config
Configは、ディクショナリ形式で、モジュール全体で共有できる。
以下のソースは、公式サイトから転載
・configの設定
import webapp2 config = {'foo': 'bar'} app = webapp2.WSGIApplication(routes=[ (r'/', 'handlers.MyHandler'), ], config=config)・configの使用方法
import webapp2 class MyHandler(webapp2.RequestHandler): def get(self): foo = self.app.config.get('foo') self.response.write('foo value is %s' % foo)僕の場合は、config.pyやcommon.pyを作って共通設定を書いているので、あまり使いドコロが分からなかったのですが、この設定は、「モジュール単位」に設定が出来るようです。当サイトでも、公開画面と管理画面でモジュールを分けていて、管理画面はadmin権限でのアクセスを設定しています。このような場合に、webapp2の
configを設定しておくと、classを共有していた場合に、configの値を参照することで振る舞いを切り分けることが出来そうです。 - Registry
インスタンス間を跨った、アプリケーション全体での共有ディクショナリのようです。
以下のソースは、公式サイトから転載import webapp2 def get_parser(): app = webapp2.get_app() # Check if the instance is already registered. my_parser = app.registry.get('my_parser') if not my_parser: # Import the class lazily. cls = webapp2.import_string('my.module.MyParser') # Instantiate the imported class. my_parser = cls() # Register the instance in the registry. app.registry['my_parser'] = my_parser return my_parserシングルトン的な使い方が可能な感じですかね。使い方としては、GAEのmemcacheと同じ考え方のようです。先にRegistryから取得してみて、取得出来ない場合には生成する処理を実施し、Registryにセットする。
ただ、GAEの場合は、スピンダウンが割りと頻繁に起こると思いますので、memcacheを利用するのが正解の様な気がします。
- Error handlers
WISGアプリケーションとしてのエラーハンドリングの方法ですね。httpのresponseを制御する為の方法で、ドキュメントでも、404,500はハンドリングした方が良いと書いてあるようです。
以下のコードも、公式ドキュメントからの転載です。
import logging import webapp2 def handle_404(request, response, exception): logging.exception(exception) response.write('Oops! I could swear this page was here!') response.set_status(404) def handle_500(request, response, exception): logging.exception(exception) response.write('A server error occurred!') response.set_status(500) app = webapp2.WSGIApplication([ webapp2.Route(r'/', handler='handlers.HomeHandler', name='home') ]) app.error_handlers[404] = handle_404 app.error_handlers[500] = handle_500使い方は、コードを見ればわかると思いますが、
logging.exception(exception)は、loggingの特別な出力方法のようです。これで、stack traceが出力できます。response.set_status(404)は、固定でコードを入れるのがイマイチな場合は、response.set_status(exception.code)とすると、受け取ったレスポンスコードがセットできるようです。僕が使うときは、面倒なので404と403を同じ404の画面を返しているのですが、コードは、403のまま返したい時などに利用できそうです。
1人でやっている時は、なかなか読み切れず、とりあえず動けばよい程度で使っていますが、頑張って呼んでみると色々分かってきて面白いですね。