Google App Engineのスタートガイド通りに導入します。
『Hello World!』
はすぐに出すことができました。(思いっきり省略。)
Python2.6を使用します。
動的webページを表示する
ブラウザで動的webページを表示させます。
以下、スタートガイドになぞらえて実装します。
プロジェクト作成
プロジェクトを作成します。
当面、ここでは
Google App Engine Launcher
を使用して開発を行います。
新しくプロジェクトを作成すると、以下の3つのファイルが自動作成されます。
app.yaml
index.yaml
main.py
app.yaml
yamlは、スペースを使用したインデントで階層を表現するデータフォーマットです。
Javaのサーブレットでいうところのweb.xmlみたいなものでしょうか。
以下のような内容になります。
---------------------------------------------------------------------------
application: newproject
version: 1
runtime: python
api_version: 1
handlers:
- url: .*
script: main.py
---------------------------------------------------------------------------
application: ・・・ アプリケーション識別子です。任意のアプリケーション名です。
version: ・・・ アプリケーションのバージョンです。とりあえず1を指定します。
runtime: ・・・ GAEのランタイム環境です。ここではpythonを指定します。
api_version: ・・・GAEが提供するランタイムのバージョンを表します。現在のところPythonは、1のみ使用可能です。
handlers: ・・・ URLパターンと処理方法です。URLが*(全部)の場合に呼び出されるスクリプトを記載します。
main.py
いよいよPythonです。ページを生成するスクリプトです。
交通費の登録画面を作成します。
金額と事由の入力テキストボックスと、登録ボタンを用意します。
HTMLは、テンプレートを使用することもできるようですが、とりあえず
スタートガイドと同じようにべた書きで・・・レスポンスに書き込んでいます。
---------------------------------------------------------------------------
import cgi
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
class MainPage(webapp.RequestHandler):
def get(self):
self.response.out.write("""
<html>
<head>
</head>
<body>
<form action="/entry" method="post">
<div>金額:<input tyep="text" name="amount"></div>
<div>事由:<input tyep="text" name="cause"></div>
<div><input type="submit" value="登録"></div>
</form>
</body>
</html>""")
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == "__main__":
main()
---------------------------------------------------------------------------
実行したところ、日本語が文字化けしてしまいました。
main.pyのエンコードがShift_JISでした。
これをUTF-8にしてみたら日本語もうまく表示されました。
コード解説
if __name__ == "__main__":
main()
このスクリプトファイルが実行された際に、__name__という変数に"__main__"という値が入ります。
そして main関数が呼び出されます。
application = webapp.WSGIApplication(
[('/', MainPage)],
debug=True)
def main():
run_wsgi_app(application)
mainの定義です。run_wsgi_appを呼び出しています。
WSGIApplication
引数のapplicationは、以下のクラスを代入しています。
class WSGIApplication(url_mapping, debug=False)
GAEのAPIです。
url_mappingは、リクエストのURLパスと、ハンドラクラスのマッピングを
タプルで設定します。
[('/', MainPage)]
URL : ”/”
ハンドラクラス : "MainPage"
となります。
タプルは、構造体みたいなもので、型の異なる値を順序づけてまとめられるものです。
次回以降に画面遷移をやるつもりですが、以下のように、複数のURLに対するディスパッチを定義することも可能です。
[('/', MainPage), ('/entry', EntryPage)]
・・・で、run_wsgi_appはapplicationの設定どおり、
MainPage(webapp.RequestHandler)
クラスを呼び出します。
RequestHandler
class MainPage(webapp.RequestHandler):
def get(self):
class宣言の()内は、継承元の親クラスとなります。
MainPageはwebapp.RequestHandlerを継承したサブクラスです。
RequestHandlerは、Httpリクエストを処理するクラスです。
HTTPのメソッド
get(*args)
post(*args)
等々が定義されているようです。
MainPageでは
get(*args)
をオーバーライドします。
get(self)
selfとは・・・
Pythonでは、クラスメソッドの第一引数は、自分自身のインスタンスが
渡されます。javaでいう、thisのようなものです。
selfという名前は慣例のようです。
RequestHandlerがインスタンス属性として保持している
response.outオブジェクトのwriteメソッドにHTML文字列を渡して、ブラウザに表示される、
という仕組みです。
これで登録画面を表示することができました。
次回は、登録した内容を表示する確認画面に遷移できるように改造します。