GAE のwebappフレームワークについて、使い方を忘れないうちにまとめる。
1. リクエストのマッピングURLから.pyファイルにマッピングするのは
app.yamlだが、.pyファイル内のクラスにマッピングするのはWSGIApplicationクラス。
WSGIApplicationはリクエストを受け取ると、RequestHandlerクラスのインスタンスを生成し、リクエストのHTTPアクションに応じたメソッドを実行する。
WSGIApplicationクラスの使用方法は、
アプリケーションの実行を参照。
2. リクエストデータの取得詳細は
Requestクラス を参照。
・GET/POSTパラメータの取得
getval = self.request.get('パラメータ名')
パラメータが存在しない場合は、空文字列('')を返す。
・Cookie値の取得
self.request.cookies から取得する。
cookieID = 'cid' # Cookie名
# Cookie名が存在しない場合は空文字列を取得
cookieval = self.request.cookies.get(cookieID, '')
self.request.cookiesには
マップ型の操作が可能。
・リモートユーザーのIPアドレスの取得
getip = self.request.remote_addr
3. レスポンスの作成詳細は
Responseクラスを参照。
・レスポンスの記述
self.response.out.write('出力HTML')
・テンプレートを使用してレスポンスを記述
Djangoテンプレートを使用可能。使い方は
テンプレートの使用を参照。
Djangoテンプレートの構文などは
Djangoテンプレート言語を参照。(
webappフレームワークのDjangoはバージョン0.96なので注意)
<2011/2/17 追記>
Django1.2も標準で含まれており、デフォルトのバージョンも0.96から変わる予定。
Djangoのバージョン指定方法は
webappでDjango1.2のテンプレートを使う を参照。
<追記ここまで>
テンプレートの継承機能を使うと、共通部分をまとめて記述/修正できて便利。
・レスポンスのHTTPヘッダー
self.response.headers に設定する。
これは
wsgiref.headers.Headersクラスのインスタンス。
ajaxのレスポンスでは以下のようにヘッダーを変更する。
self.response.headers['Content-Type'] = 'text/xml ;charset=UTF-8'
HTTPヘッダーの制限事項は、
許可されないHTTPレスポンスヘッダーを参照。
・Cookieの書き込み、削除
レスポンスのHTTPヘッダーに直接書き込む。
# Cookieに書き込む
cookieID = 'cid' # Cookie名
cookieval = 'valueforCookie' # Cookieにセットする値
# Cookieの有効期限に約1年後を設定
expirdt = (datetime.datetime.utcnow() + datetime.timedelta(365))
expirdtstr = expirdt.strftime('%a, %d-%b-%Y %H:%M:%S UTC')
self.response.headers.add_header('Set-Cookie', '%s=%s; expires=%s' %
(cookieID, cookieval, expirdtstr))
# Cookieから削除する
cookieID = 'cid' # Cookie名
cookieval = 'valueforCookie' # Cookieにセットする値
# Cookieの有効期限を昨日の日付にする
expirdt = (datetime.datetime.utcnow() - datetime.timedelta(1))
expirdtstr = expirdt.strftime('%a, %d-%b-%Y %H:%M:%S UTC')
self.response.headers.add_header('Set-Cookie', '%s=%s; expires=%s' %
(cookieID, cookieval, expirdtstr))
・リダイレクト、ステータスコードの設定
リダイレクト、ヘッダー、ステータス コードを参照。
self.error(code) は、それ以前に記述したレスポンスを消去するので注意。
消去しない場合は、self.response.set_status(code) で設定。
4. その他セッション機能は公式にサポートしていない。
Googleアカウント前提の場合、
@login_required が便利。ただしGETリクエスト専用。
以上。
公式ドキュメントは大した分量ではないので、時間がある方はひと通り目を通したほうがいいと思います。