Django on GAEで作るmixiアプリ
まりもが大人気のmixiアプリに惹かれて、ちょっと入門してみました。
セットアップ
app-engine-patchのインストール
GAE用にdjangoにpatchをあてたapp-engine-patchというプロジェクトがあるので、それを使います。
下のページのdownloadからblankプロジェクトをダウンロード
http://code.google.com/p/app-engine-patch/
プロジェクトのzipを展開します。これでdjangoがGAEで使えます。
mixiアプリの開発
プロジェクトの開始
展開した中のapp.yamlのappidをGAEで取得したappidに設定します。
Controllerの実装。
views.pyを編集します。views.pyというのは、いわゆる普通のWAFでいうControllerです。これを編集して、service, modelに処理を委譲します。
以下のような感じです。container作ったりという処理は、serviceや modelで実装するのがbetterです。
def print_person(request): st = request.GET.get('st', '') st = urllib.unquote(st).encode('raw_unicode_escape').decode('utf8') container = get_container(st) person = container.fetch_person('@viewer')
stはsecurity tokenをrequest parameterとして渡したものです。
containerの取得などについては、以下のエントリを参照してください。
http://dann.g.hatena.ne.jp/dann/20091117/p1
URLとcontrollrのmapping
urls.pyでします。views.pyに記述されたmethodにURLをmappingします。
urlpatterns = patterns('', (r'^$', 'print_people'), )
PYTHONPATHへのライブラリの追加
GAE上でライブラリをロードするために、PYTHONPATHへライブラリのパスを追加します。
settings.pyに
import sys, os rootdir = os.path.dirname(__file__) sys.path.insert(0, os.path.join(rootdir, "lib"))
のようにすることで、lib以下においたpython系のライブラリをPYTHONPATHに追加する事ができます。
opensocial-python-clientをダウンロードしてlib以下にコピーします。
http://code.google.com/p/opensocial-python-client/
mixiアプリ用のgadget.xmlの作成
<?xml version="1.0" encoding="UTF-8"?> <Module> <ModulePrefs title="Hello, World!"> <Require feature="opensocial-0.8" /> </ModulePrefs> <Content type="html" view="canvas"> <![CDATA[ <script type="text/javascript"> gadgets.util.registerOnLoadHandler(function(){ location.href = "http://xxx.appspot.com/xxx/?st=" + encodeURIComponent(shindig.auth.getSecurityToken()); }); </script> ]]> </Content> </Module>
securityTokenをリクエストパラメータで渡して、サーバー側で使います。これを渡す事で、コンテナにアクセスできます。
CDATA内に書かれたものがmixiアプリのiframeの中に展開されます。結果として、security tokenがアプリ側にリクエストパラメータとして渡されます。
このgadget.xmlは、publicなところに置いておけばいいです。例えば、mediaディレクトリなど、Djangoのディレクトリ内にいれておくのでも構いません。
GAEへのupload
djangoのmanage.pyを使って以下のようにアップロードする事が出来ます。
manage.py update
このmanage.pyでは、最終的にGoogle App Engineのappcfg.pyを使ってuploadしています。途中でメールアドレスとパスワードを聞かれますが、正しく入力しましょう。
間違ってパスワードを設定すると、appcfg.pyが間違った場合のcookieを見てしまいパスワードを聞かれなくなります。そういう場合は~/.appcfg_cookies を消して、再度manage.py updateを実行します。
admin consoleの設定
django用の管理画面を使えるようにするためにパスワードを設定します。
./manage.py shellでpythonシェルを起動
>>> from django.contrib.auth.models import User >>> user = User(username='admin', is_superuser=True, is_staff=True) >>> user.set_password('admin') >>> user.put()
実行後は、manage.py updateを実行しておきます。
debug方法
以下、GAEでのdebug tipsです。
logger
import logging
logging.warn(xx)
GAEのアプリの管理画面のLogsにログが表示されます。
python版Data::Dumper
import pprint pp = pprint.PrettyPrinter(indent=4) logging.warn(pp.pprint(person))