2010年3月14日日曜日

PythonでGAE編 2.画面遷移を行う

画面遷移

登録画面→登録ボタン→登録結果画面
と画面遷移をする実装を行います。

WSGIApplicationへのパラメータ追加

WSGIApplicationの引数には、URLとハンドラクラスのマッピングを設定していました。
今回追加の登録結果画面へのURLとハンドラクラスの設定を追加します。
以下の赤字部分を追加です。
URLを/entryとし、リクエストハンドラクラスはEntryとします。

---------------------------------------------------------------------------
application = webapp.WSGIApplication(
[('/', MainPage),
('/entry', Entry)],
debug=True)
---------------------------------------------------------------------------

RequestHandlerクラスの追加

Entryクラスを追加します。
登録結果画面のHTMLを送出する処理を行っています。
登録画面では、POST送信をしているので、今回のメソッドは
def post(self)
となります。

---------------------------------------------------------------------------
class Entry(webapp.RequestHandler):
def post(self):
self.response.out.write('<html><body>')
self.response.out.write(unicode('<div>金額:','UTF-8'))
self.response.out.write(cgi.escape(self.request.get('amount')))
self.response.out.write('</div>')
self.response.out.write(unicode('<div>事由:','UTF-8'))
self.response.out.write(cgi.escape(self.request.get('cause')))
self.response.out.write('</div>')
self.response.out.write('</form>')
self.response.out.write('</body></html>')
---------------------------------------------------------------------------

request.get

登録画面で送信したリクエストパラメータを取得します。
self.request.get('パラメータ名称')
で取得出来ます。
cgi.escapeはHTMLのタグ文字のエスケープを行います。


ユニコードの問題

以下のようにレスポンスに日本語を設定したら、エンコードの失敗のようでエラーとなってしまいました。

self.response.out.write(<div>'金額:')

こんなエラーメッセージ

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 5: ordinal not in range(128)

ユニコードの扱いに問題ありそうです。


とりあえずこのようにすると↓↓↓

self.response.out.write(unicode('<div>事由:','UTF-8'))

表示することができました。
unicodeにデコードするビルトイン関数です。

登録画面では、おなじ”登録”という文字列があったのに正常に表示されています。
ユニコード問題はわからないことがあるので、今後詳しく調査しようと思います。

というわけで、画面遷移自体は割と簡単に出来ました。
まぁほんとに単純な遷移で、ログインセッションのこととか、入力チェックもなんにもやってないので簡単なんですが。。。
そういったことは今後の記事で一つ一つ積み上げていきます。


次回は、データストアへのアクセスを行います。

2010年2月22日月曜日

PythonでGAE編 1.GAE導入~Webページ表示

導入

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文字列を渡して、ブラウザに表示される、
という仕組みです。

これで登録画面を表示することができました。
次回は、登録した内容を表示する確認画面に遷移できるように改造します。

PythonでGAE編 Webアプリケーションを作成する

Google App Engine(GAE)は、JavaかPythonでアプリケーションを作成することが
出来ます。

仕事では主にJavaを使用していますが、Pythonには興味があるので、Pythonで進めて
いきたいと思います。

Pythonについては現在のところド素人です。
GAEのスタートガイドをなぞって実装を進めたいと思います。

Google App Engine(GAE)でwebアプリケーションを構築します。
ここでは、簡単な交通費精算システムを作成しようと思います。

1.GAE導入~Webページ表示

2010年1月10日日曜日

クラウドコンピューティングはじめました

トットシステムです。

今流行りの『クラウドコンピューティング』。

企業の業務システムもクラウドへの移行が
加速しているとのことです。

Webシステムを生業としている弊社も近いうち
にそのようなお仕事が来るのではないかと思い、
来るべきクラウド社会に備えお勉強を始めるこ
とにしました。

というわけでまずは、とっかかりとして無料の
GoogleAppEngineを使用して、技術的側面から
クラウドコンピューティングのあれこれを記事に
することとしました。


GAE Python 入門編