遅ればせながらGoogle AppEngine(python版)でプログラムを書いてみた

AppEngineの標準の多くの機能を使って、1ファイルwikiを書いてみました。

SDK準備

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-8UTF-32を標準にしないPython自体に問題があるとは思いますが、その対応があるにもかかわらず反映しないのはやはりGoogleやとくにその日本部門に不安を感じずにはいられません。