webapp2公式ドキュメントを読み解く会(3回目)
2013年06月07日
今週も、横浜のコワーキングスペース「タネマキ」で、 GAE/Pの勉強会を実施しました。
勉強会の中で、webapp2の公式ドキュメントを読み解く会を継続して実施しています。
本日は、こちらから。
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
で取得出来そう。
この項目で言おうとしていることは、あまり把握出来ませんでした。
公式サイトのサンプルソースはこちらとなっています。
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)
appをapplicationとした場合は、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 追記 ここまで --
今や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)は、リクエストを作成するためのもう関数です。
WSGI Applicationの設定は、各ソースで、以下の記述で取得することができます。
import webapp2
app = webapp2.get_app()
config_value = app.config.get('my-config-key')
以上で、The WSGI applicationの項目が終了です。一つの項目で3回もかかってしまいました。
次回は、引き続きURI routingを読み解いていく予定です。