KayっていうGoogle App Engine に載せるフレームワークの勉強してきた

2009/11/14に行われた、Python Hack-a-thon #2
に参加して、Kayフレームワークの勉強をしてきました。
講師は、開発者の松尾さんです。


Python Hack-a-thon #2
http://atnd.org/events/1288
ラクル青山センター 2009/11/14 10:00-19:00

Kayの基本

Kay = ケィ
http://code.google.com/p/kay-framework/

ドキュメント

http://kay-docs-jp.shehas.net/

Kayで作られたアプリケーション

theokayblog(ブログ)
http://code.google.com/p/theokayblog/

心を引いたKayの特徴

デバッグ機能。
  • エラーの位置が詳細に表示される
  • エラー画面からコンソールを叩ける

Pythonのアプリだと、この機能がついているものは多いけれど、Kayのは少し高機能で実行結果で画面がリアルタイムに書き換わる。

データのインポート機能、エクスポート機能がある

データのダンプとリストアができる。
別のappspotのデータも移行できる。ある時点のデータも残せる。


ローカルとappspot.comとで、管理系データ共通にしづらいとか、ローカルでテストしづらいとか、よくあるので、この機能は非常にありがたい。
自前でアップロード機能作ってたぐらい、必要としている機能です。

ユーザ情報の管理機能

Googleアカウントによる認証を扱わない場合用の、ユーザをコマンドラインから作り出せる。

テンプレートをPythonコードに変えて高速化

ワンクッション挟むことで、テンプレートをPythonのコードに変換できる。

Kayの始め方

ここから下は、メモ。よほど困っていない限り、ここを読まずに、チュートリアルを読んだ方がよい。
環境は、Mac OSX Snow Leopardです。

Google App Engineのインストール

アプリケーションを落としてきて、インストールする。
http://code.google.com/appengine/downloads.html

IPythonのインストール

easy_installでインストールする。実は入れなくても動作する。

easy_install ipython
mercurialのインストール

MacPortsでインストールする。MacPortsのインストールは省略。

sudo port install mercurial
/usr/local/src/kayにkayのソースを落とす。

実際には他の場所でも良い。

cd /usr/local/src
hg clone https://kay-framework.googlecode.com/hg/ kay
プロジェクトを作成

kayappsという名前でプロジェクトを作ることにします。
「manage.py」というシンボリックリンクができるから、
今後manage.pyを実行する時は、絶対パスではなく、そのシンボリックリンクを叩きます。

cd /path/to/workdir
python2.5 /usr/local/src/kay/manage.py startproject kayapps
Google App Engineで、アプリケーションの名前を予約

名前はプロジェクト名。誰かと被ると作れない。早いもの勝ち。
手順的に先にやるべきかも。
https://appengine.google.com/start/createapp

アプリケーション作成

appsという名前でアプリケーションを作ることにします。

cd /path/to/workdir/kayapps
python2.5 manage.py startapp apps
アプリケーションを登録

settings.pyを編集して、アプリケーションをマッピング

# settings.py
INSTALLED_APPS = (
)
APP_MOUNT_POINTS = {
}

次のように編集。
作ったアプリケーションをルートにマッピングすることにします。

# settings.py
INSTALLED_APPS = (
    'apps',
)
APP_MOUNT_POINTS = {
    'apps': '/',
}
開発用サーバを動かす
python2.5 manage.py runserver

動作の確認は、 http://localhost:8080/

GAEにアップロード
python2.5 /usr/local/src/kay/manage.py appcfg update

動作の確認は(この場合)、 http://kayapps.appspot.com/

テンプレートのコンパイル

テンプレートがpythonコードにコンバートされているのを確認。

# コンパイル前のテンプレート
apps/templates
# コンパイル後のテンプレート
apps/templates_compiled

ソースコード一部抜粋。

# apps/templates_compiled/index.html
def root(context, environment=environment):
    l_message = context.resolve('message')
    if 0: yield None
    yield u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n<title>Top Page - apps</title>\n</head>\n<body>\n%s\n</body>\n</html>' % (
        escape(l_message), 
    )

確かに、pythonのコードに変換されている。

モデルの作成

モデルの作り方は通常の方法と変わらないですね。

# apps/models.py
class Comment(db.Model):
    user = db.ReferenceProperty()
    body = db.TextProperty(required=True)
    created = db.DateTimeProperty(auto_now_add=True)
コマンドラインからのデータの登録

まず、インタラクティブシェルを動かして、

# 通常、こちら。
python2.5 ./manage.py shell
# ipython使わない場合
python2.5 ./manage.py shell --no-use-ipython

データを登録。

# > Running on Kay-0.4.0
# > Interactive Kay Shell
cl = Comment(body='hello , guest book')
# > cl.put()
datastore_types.Key.from_path(u'apps_comment', 1, _app_id_namespace=u'kayapps')
cl.body
# > u'hello , guest book'

最後はControl-D で抜ける。


この機能は良いなぁ、と思っていたら、
Google App EngineのDevelopment Console
http://localhost:8080/_ah/admin/interactive
でも、同じように登録できることに気がついた。

from model.message import Message

m = Message(
user_name='user',
message_subject='message',
message_body='message body'
)
m.put()

開発中は助かる。便利だなー、これ。

残りは宿題。

感想

機能面では、データのインポートとエクスポートの機能が便利やなぁ、と。
あと、ドキュメントが揃ってて、意外と始めやすいです。


Kayは標準的なdjangoフレームワークと比べて、どういう場面に向くだろう。
自分は案件が始まったときに、そのプロジェクトで使用するフレームワークを選べる立場にいることが多いので、
GAE案件があったときに、Kayを使うかどうか考えてみたい。
(その前に、Java派との戦いがあるような気がしますが)