遅ればせながらGoogle AppEngine(python版)でプログラムを書いてみた
AppEngineの標準の多くの機能を使って、1ファイルwikiを書いてみました。
SDK準備
- Python-2.5がインストールされてるシステム
- GAE SDK 1.2.3: http://code.google.com/intl/en/appengine/downloads.html
Linux/Other版は、zipを展開するだけです。
付属スクリプトは、相対PATHで実行可能です。
cd myapp python2.5 ../google_appengine/dev_appserver.py -a 0.0.0.0 -p 3000 . python2.5 ../google_appengine/appcfg.py update .
dev_appserverはローカルでサーバを立ち上げて実行するコマンドです。appcfg updateはappspot.comにアップロードするコマンドです。
アプリケーションIDを取得する
ここでアプリケーションIDを取得するためには、フォームにケータイ等のショートメールアカウントを入れる必要があります。自分は、willcomのpdx.ne.jpのを使いました(エッジとか呼んでたDDIポケット時代のだけど、数年ぶりに使用しうまく受け取れました)。
メールに数字が送られてくるので、それをフォームに入れると、アプリケーションIDを作れるようになります。現状、一アカウント10個まで作れるようです。この数字は、これ以降使うことは無いようです。以降、管理画面のログインはgmailアカウントで入ります。
プロジェクト構造
以下、例としてアプリケーションIDをmyappとします(上記wikiの設置の場合bellbindになります)。
空のディレクトリmyappを作り、そこに二つファイルを入れます。
これでdev_appserverでテストし、appcfg updateでアップロードすれば配置完了です。
app.yaml
Python版AppEngineアプリの唯一の必須ファイルで、設定を記述します。
application: myapp version: 1 runtime: python api_version: 1 handlers: - url: /wiki(?:/.*)? script: wiki.py - url: /admin/.* script: $PYTHON_LIB/google/appengine/ext/admin login: admin
下のは管理UI用のリンクです。そこでログをみたり、ストレージデータの操作とかできます。
wiki.py
1ファイルのみで200行程度ですが、pluginやtemplate、簡単な認証システムを実装してあります。PageデータにはExpandoを使っていて、plugin側で自由にプロパティをつけることができるでしょう。scriptタグなどの処理をしてないため、スクリプト埋め込みの脆弱はあります(後述)。
感想
最初日本版ダウンロードページからの1.2.0を使ってしまったため、Templateでの日本語処理ができずにはまりました。
easy_installで取ってきたeggを添付すれば、サニタイズ用として、html5libやBeautifulSoupを使うことができました(この二つはPIL同様に標準に含めて欲しいな)。
以下は、ライブラリの添付の仕方です。
- myapp/eggs/html5lib-0.11.1-py2.5.egg
- myapp/eggs/BeautifulSoup-3.1.0.1-py2.5.egg
と置いて、これらをスクリプトの頭のほうでsys.pathに追加すれば、importできるようになります。
# app.yaml に書く.pyファイルの先頭にて import os import sys for arch in os.listdir("eggs"): sys.path.insert(0, os.path.join("eggs", arch)) pass import html5lib
handlerに記述するpyファイルは、チュートリアルにあるように、cgiスタイルな実装ならいいようです。web.pyを使うというのもありかも。
GAE標準で備わってる機能もほぼ使い、確認してみました。前述のTemplateとTextPropertyのフィールドがTextクラスのインスタンスである点以外はそれほど悩みませんでした。これもasciiならたぶんstr扱いで問題が出ないようになってます。
非asciiに難があるのは、どちらかというとUTF-8やUTF-32を標準にしないPython自体に問題があるとは思いますが、その対応があるにもかかわらず反映しないのはやはりGoogleやとくにその日本部門に不安を感じずにはいられません。