2011年05月20日

webappフレームワークを使ったフォーム操作。

前回は webapp フレームワークを使ったGAEアプリ開発方法の基本を紹介した。
今回は webapp フレームワークを使ったフォームの操作方法を紹介する。ウェブフォームから送信されたメッセージを受け取り、画面に返すという簡単な処理だ。

では早速 helloworld.py を以下のように編集してみよう。

# -*- coding: utf-8 -*-
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>
<body>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="Sign Guestbook"></div>
</form>
</body>
</html>""")


class Guestbook(webapp.RequestHandler):
def post(self):
self.response.out.write('<html><body>You wrote:<pre>')
self.response.out.write(cgi.escape(self.request.get('content')))
self.response.out.write('</pre></body></html>')

application = webapp.WSGIApplication(
[('/', MainPage),
('/sign', Guestbook)],
debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


開発用Webサーバを起動し、http://localhost:8080 へアクセス。
フォームが表示されていることを確認できたら、テキストボックスに何か適当に文字列を打ち込んで、「Sign Guestbook」ボタンを押してデータを送信してみよう。そうすると次の画面で自分が入力したデータが表示されていることだろう。

では、上のソースコードの説明に入る。

まず、以下のコードでURLと処理クラスを紐付けている。
application = webapp.WSGIApplication(
[('/', MainPage),
('/sign', Guestbook)],
debug=True)

/ がブラウザから呼ばれるとMainPageクラスで処理を行い、/sign がブラウザから呼ばれると Gustbook クラスで処理を行うということだ。これは前回説明した通りだから、もうこれ以上の説明は要らないだろう。

そのMainPageクラスでは以下のようにgetメソッド内で初期画面を描画するためのHTMLが出力されている。そのHTMLには form も記述されていて、「Sign Guestbook」ボタンを押すと、textareaで入力したデータを content という名前で /sign というURLへ向けてpostするようになっている。
<form action="/sign" method="post">


そして、/sign と紐付いた Guestbookクラスの post メソッドの処理へと移る。
class Guestbook(webapp.RequestHandler):
def post(self):
self.response.out.write('<html><body>You wrote:<pre>')
self.response.out.write(cgi.escape(self.request.get('content')))
self.response.out.write('</pre></body></html>')

この処理が行っていることは至って単純だ。
self.request.get('content') という処理で先程のフォームから送られてきた content という名称のデータの値を取得し、そのデータを cgi.escape()でHTML特殊文字をエスケープして表示しているだけのことである。
ちなみに、このcgi.escape()cgiというモジュールは、Pythonの標準ライブラリに含まれるモジュールである。


webapp フレームワークを使ったフォーム操作は以上だ。
webapp は非常にシンプルで理解しやすいフレームワークであることが分かるだろう。

さて、次回はデータストア(GAE用のデータベースみたいなもの)を利用してデータを保存・取得する方法を紹介したいと思う。


(続く)



ここはひとつポチっとよろしく。
人気ブログランキングへ


プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 48590



posted by 寄り道退屈男 at 22:12 | Comment(0) | TrackBack(0) | GAE for Python

2011年05月19日

webappフレームワークを使ったGAEアプリ開発の超基本。

前回は GAE for Python を使った Hello World!アプリの開発を行った。
今回から webapp というWebアプリケーションフレームワークを使って、前回よりも少しだけ実用的なアプリを作ってみる。

webapp とは GAE for Python 独自のWSGI準拠なフレームワークだ。SDKにデフォルトで組み込まれているので、明示的にバンドルする必要もなくお手軽である。

ちなみに GAE for Python では、Python のみで書かれたWSGI準拠のフレームワーク(例えば、Django、CherryPy、Pylons、web.py など)であれば、アプリのディレクトリにコピーするだけでどれでも使えるらしいのだが、今回は無難に webapp を利用する。


さて、早速始めよう。

まず、webappには以下の三つのパーツがある。

(1) RequestHandlerクラス
  リクエストを処理し、レスポンスを作成する。
(2) WSGIApplication インスタンス
  着信したリクエストを、URLと関連付けられたハンドラへルーティングする。
(3) メインルーチン
  CGIアダプタを使用して WSGIApplication を実行する。

これらを頭に入れておき、前回作った helloworld.py を以下のような webapp 版に書き換えてみよう。

# -*- coding: utf-8 -*-
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.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, webapp World!')

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

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


では、http://localhost:8080 へアクセスして確認しよう。
※前もってローカル開発用Webサーバを起動させておくことをお忘れなく。起動の仕方は、前回を参照。

この単純なアプリのソースコードを軽く説明する。

まず 14行目以降はWSGI-CGIアダプタの処理で、まぁここらへんはお決まりの作法として覚えておくとして、大切なのは、5-8行目のMainPageクラスと、10-12行目のWSGIApplicationインスタンス生成の箇所だ。

WSGIApplicationインスタンス生成の所では、「どういうリクエストが来たらどのクラスを呼び出すか」を決定している。

この例の場合、/ がブラウザから呼ばれたら、MainPageクラスをインスタンス化し、そのgetメソッドの処理が実行される。getメソッド内では、self.responseにプロパティを設定したり、ブラウザへの出力する処理が書かれている。

ちなみに、12行目の debug=true はデバッグ出力用で、ハンドラエラーや例外をキャッチしたときにスタックトレースをブラウザに返すための記述だ。なので本番リリース時は削除しても良いだろう。


以上が webappフレームワークを利用したアプリ開発の基本中の基本だ。
webapp フレームワークについての詳細は webapp リファレンス を参照すべし。


では、ここで少しだけ高度な処理も追加してみよう。
Googleインフラを利用してGoogleユーザーアカウントを取得する処理だ。

helloworld.py を以下のように編集してみよう。

# -*- coding: utf-8 -*-
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):
user = users.get_current_user()

if user:
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, ' + user.nickname())
else:
self.redirect(users.create_login_url(self.request.uri))

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

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


http://localhost:8080 にアクセスすると、ローカル開発用のダミーログインページへリダイレクトされる。ここでアプリのテストが可能だ。

テキトーにユーザ名の所に「hoge@moge」などと入力し、ログインボタンを押してみると「Hello, hoge@moge」というダミーのログイン成功ページへ移動する。

このソースコードの大事な部分だけを抽出して説明する。

まず、ユーザーアカウント情報であるUserオブジェクトを取得するための処理だ。
user = users.get_current_user()

取得したユーザーアカウント情報が存在すれば、以下のようにしてUserオブジェクトのnicknameプロパティを表示。
self.response.headers['Content-Type'] = 'text/plain'
self.response.out.write('Hello, ' + user.nickname())

もし、ユーザーアカウント情報が存在しなかった場合は、以下のようにしてログイン画面へ戻している。
self.redirect(users.create_login_url(self.request.uri))


何のことない。
超シンプルで明快なコードだ。

User API に関してもう少し詳しく知りたい人はユーザーリファレンスを参照のこと。



というわけで、少しだけ高度になったわけだけれど、着いて来れてるかな。
最後のGoogleアカウントの扱いのところは兎も角、前半のwebappフレームワークの使い方に関しては今回紹介したところが基本中の基本なのでしっかりと覚えておこう。

あれ?
そういえば、実用的なアプリを作ってみるとか言いつつ、まだ全然実用的じゃない、、、
まぁ次回に期待してくれ。


(続く)



ここはひとつポチっとよろしく。
人気ブログランキングへ


プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 48590



posted by 寄り道退屈男 at 16:42 | Comment(0) | TrackBack(0) | GAE for Python

2011年05月17日

GAE+Python で Hello World!

前回は GAE for Python のローカル開発環境をセットアップした。
今回は GAE for Python を使った「Hello, World」アプリの作成に挑戦だ。

GAE+Pythonな開発手順を簡単に纏めるとこうだ。

 手順1: リクエストハンドラ作成
 手順2: yaml(設定ファイル)作成
 手順3: アプリのテスト

何の事はない。スクリプト書いて設定ファイルを書くだけだ。
では早速、手順1から始めてみよう。


■手順1: リクエストハンドラ作成

まず適当な場所に helloworld というフォルダを作成し、そこに helloworld.py ファイルを新規作成。ファイルの中身は以下のように記述する。

# -*- coding: utf-8 -*-
print 'Content-Type: text/plain'
print ''
print 'Hello, world!'


今さらだがファイルはutf-8で保存するとは後々文字コードでハマらずに済む。
上記の1行目はPythonの文字コード指定の記述法で、ここではutf-8を指定している。これはおまじないだと思って必ず書くようにすると良いだろう。

さて、次に進む前にここで一度上記のスクリプトが正常に動作することを確認するためにコマンドラインから適当に実行しておこう。後々ツマらぬハマりを防ぐためだ。


■手順2: yaml(設定ファイル)作成

さて次に設定ファイルを書く。
GAEには app.yaml という設定ファイルがある。
このファイルには、「どのハンドラスクリプトをどのURLに対して使用するか」を記述する。

では、先程作った helloworld フォルダに app.yaml というファイルを新規作成しよう。ファイルの中身は以下のように記述する。

application: helloworld
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: helloworld.py


このファイルの中身を簡単に説明していくとこうだ。

1行目:
GAEへアプリ登録する際の一意の識別子だ。
取り敢えず今はローカル開発環境でのテストなので helloworld のままでもよい。

2行目:
そのまんま、アプリのバージョンを表す。

3-4行目:
Pythonランタイム環境上でのバージョンを表す。
取り敢えず今はおまじないだと思っておけば良い。

6-8行目:
ここが一番重要。
どういうリクエストが来たらどのPythonスクリプトで処理するかを記述している。
この場合だと、全て(/.*)のリクエストを helloworld.py で処理する。

なお、app.yamlの詳しい説明はapp.yamlリファレンスを参照のこと。

ハンドラスクリプトと設定ファイルを書いて、各URLにハンドラをマッピング出来たので、これでアプリケーションは完成である。
シンプルでいい。


■手順3: アプリのテスト

アプリが完成したら早速テストだ。
前回インストールしたSDKに含まれる簡易Webサーバを使ってこれをテストしてみよう。
簡易WebサーバはSDK_HOMEにある dev_appserver.py である。

コマンドラインから以下のように実行する。
引数の helloworld/ は今回作成したプロジェクトのフォルダ名だ。自分の環境に合わせてパスを書き換えよう。


dev_appserver.py helloworld/


起動後、ログがダラダラと流れて最後に以下のようなログが出ていればWebサーバの起動は成功である。

INFO 2011-05-17 12:05:29,719 dev_appserver_multiprocess.py:637] Running application helloworld on port 8080: http://localhost:8080


早速ブラウザから以下のURLを叩いてみよう。

http://localhost:8080/

ブラウザに「Hello, World!」と表示されていれば成功だ。


Helloworldアプリの開発は以上だ。
これでGAE+Pythonな開発の大まかな流れは掴めただろう。

ちなみにこのWebサーバはスクリプトの編集の度に再起動をする必要がないのでサクサクと開発ができる。


さて、次回はwebappフレームワークを利用してもう少し実用的なアプリを開発してみるつもりだ。

(続く)



ここはひとつポチっとよろしく。
人気ブログランキングへ


プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 48590



posted by 寄り道退屈男 at 21:45 | Comment(0) | TrackBack(0) | GAE for Python

2011年05月16日

GAE+Pythonなローカル開発環境を準備。

GAE for PythonでWebアプリを作るためにまず一番初めにやらなきゃいけないこと。
それは、GAE for Python なローカル開発環境を構築することだ。

取り敢えずGoogle本家サイトを参考にしながらセットアップすることに。

http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.html


■Python インストール

というわけで、まずは Python のインストール。
使用マシンがWindows7な俺は無難に Windows x86 MSI Installer をダウンロードした。

http://www.python.org/download/

現在Pythonのバージョンには2.x系と3.x系の二つが存在しているのだが、この後インストールするGAEのSDKは今のところ2.x系(2.5以上)でないと正常動作しないようなので、ここは取り敢えずv2.x系のインストーラー python-2.7.1.msi をダウンロード。ダウンロードしたインストーラーを実行したら後は何も考えずに全て「はい」を選んで標準インストール。


■Google App Engine SDK インストール

次に Google App Engine SDK for Python をダウンロード。

http://code.google.com/intl/ja/appengine/downloads.html#Google_App_Engine_SDK_for_Python

今回ダウンロードしたインストーラーファイル名は GoogleAppEngine-1.5.0.msi。こちらも全て「はい」で標準インストール。


■Hello World!

さてこれでPythonとGAEのSDKのインストールが完了した。
次はお馴染みの「Hello World!」アプリの作成だ。

(続く)


ここはひとつポチっとよろしく。
人気ブログランキングへ


プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 48590



posted by 寄り道退屈男 at 21:04 | Comment(0) | TrackBack(0) | GAE for Python