読者です 読者をやめる 読者になる 読者になる

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=&#39;admin&#39;, is_superuser=True, is_staff=True)
>>> user.set_password(&#39;admin&#39;)
>>> user.put()

実行後は、manage.py updateを実行しておきます。

debug方法

以下、GAEでのdebug tipsです。

Djangoでのdebug画面の設定
Debug=True

とsettings.pyに記述しておきます。

これで例外発生時にDebug Screenが表示されます。

logger
import logging
logging.warn(xx)

GAEのアプリの管理画面のLogsにログが表示されます。

python版Data::Dumper
    import pprint
    pp = pprint.PrettyPrinter(indent=4)
    logging.warn(pp.pprint(person))

まとめ

GAEのお陰でスケーラブルなmixiアプリも大分簡単に作れますね。

課題としては、security tokenをサーバー側に渡したときに、デプロイしないとデバッグできないのがちょっと面倒な点です。何かいい方法があれば、デバッグ方法を是非おしえてください。

次回はGAEのパフォーマンスとスケーラビリティについても確認してみようかと思ってます。