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

2013年06月07日

今週も、横浜のコワーキングスペース「タネマキ」で、 GAE/Pの勉強会を実施しました。

勉強会の中で、webapp2の公式ドキュメントを読み解く会を継続して実施しています。

本日は、こちらから。 

Debug flag  

debugをFalseに設定すると、500の際にクライアントにstack traceが出なくなる。

Trueに設定すると、stack traceが出る。 

App Engineでは、以下の記載をすることで、開発環境とプロダクション環境を判断することができる。

実際にSDKので起動した場合には、Development/2.0が入っている。 

import os

import webapp2

debug = os.environ.get('SERVER_SOFTWARE', '').startswith('Dev')

app = webapp2.WSGIApplication(routes=[
    (r'/', 'handlers.HelloWorldHandler'),
], debug=debug)

もし、アプリの中でdebugフラグを取得したい場合には、 

app = webapp2.get_app()
debugFlg = app.debug

で取得出来そう。

 ■Running the app 

この項目で言おうとしていることは、あまり把握出来ませんでした。

公式サイトのサンプルソースはこちらとなっています。 

import webapp2

class HelloWebapp2(webapp2.RequestHandler):
    def get(self):
        self.response.write('Hello, webapp2!')

app = webapp2.WSGIApplication([
    ('/', HelloWebapp2),
], debug=True)

def main():
    app.run()

if __name__ == '__main__':
    main()

if __name__ == '__main__':で使用していますが、通常のGAEの場合には、通常呼び出されません。Pythonの仕様で、importでの呼び出しではない場合に実行されるようになっているようで、AppEngineの場合には、UnitTest等を書いた場合のみに呼び出されると思われます。

-- 2013/5/14 追記 --

main()は、webapp2で不要になったようです。これは、上記のappをapp.yamlに記載することで、直接呼び出せる機能が追加になったということの様です。(これが、Running the appの機能ということのようですね。)

webapp2を使用する場合、app.yamlで、アプリケーションを呼び出す際の以下の記述をします。

- url: .*
 script: main.app

main.appは、main.pyの中のappを呼び出すということになりるようです。

※python2.5(webapp)の場合は、main.pyを直接指定していました。

main.pyに以下の記載をすること、appが呼び出されます。

app = webapp2.WSGIApplication([
   ('/', HelloWebapp2),
], debug=True)

appapplicationとした場合は、app.yamlでmain.applicationをすることで動くことになります。 この辺りは、AppEngineの公式サイトでも、Migrating to Python 2.7に記載があります。

以下のように、def main():以下は、Old codeとなっており、python2.7(webapp2では不要となっていることが説明されています。

import webapp2

class MainPage(webapp2.RequestHandler):
  def get(self):
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.out.write('Hello, WebApp World!')

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

""" Old code:
def main():
  run_wsgi_app(app)

if __name__ == '__main__':
  main()
"""

 -- 2013/5/14 追記 ここまで --

Unit testing

今やWeb開発の基本になってきているUnit Testです。

Unit Testでの呼び出し方法が提供されている様です。詳細は、Unit testingに記載されています。

サンプルソースはこちら。

class HelloHandler(webapp2.RequestHandler):
    def get(self):
        self.response.write('Hello, world!')

app = webapp2.WSGIapplication([('/', HelloHandler)])

# Test the app, passing parameters to build a request.
response = app.get_response('/')
assert response.status_int == 200
assert response.body == 'Hello, world!'

こちらの関数でリクエストを行い、レスポンスを受けとることができます。webapp2.WSGIApplication.get_response(*args, **kwargs)

パラメータは、Request.blank()に渡されるため、そちらと同様になります。

Request.blank(path, environ=None, base_url=None, headers=None, POST=None, **kwargs)は、リクエストを作成するためのもう関数です。 

 

Getting the current app

WSGI Applicationの設定は、各ソースで、以下の記述で取得することができます。

import webapp2

app = webapp2.get_app()
config_value = app.config.get('my-config-key')

以上で、The WSGI applicationの項目が終了です。一つの項目で3回もかかってしまいました。

次回は、引き続きURI routingを読み解いていく予定です。

 



PAGE TOP