これまで、このサイトも含めてGoogle App Engineの開発にはGoogle App Engine Helperを使っていた。同様にGoogle App EngineでDjangoを使うことを目的としたapp-engine-patchも存在することは知っていたが、ここで紹介されているGoogle App Engine Helperの方がすぐれていると思っていた。しかし、ここなどを見ると、app-engine-patchの方がよさそうとのこと。ということで、このサイトもapp-engine-patchに乗り換えることにした。
通常だとこのような入れ替えはかなり大掛かりになりそうだが、どちらもGoogle App EngineとDjangoをベースにしてあるので、それほど大きな問題はないはず、と勝手に判断。実際、あっけないほど簡単に移行が完了した。
ちなみにapp-engine-patchは現時点で最新である1.1 beta1を利用。zipファイルをダウンロードして展開し、common/zip-packagesを見ると、django-1.0.2(現時点での最新)が含まれている。すばらしい。Release Notesによると、リリースが近づいているDjango 1.1を待っているらしい。おそらく1.1がリリースされたらそれに入れ替えて、app-engine-patchの1.1がリリースされるのだろう。
指示通り、App Engine SDKは/usr/local/google_appengineに置く。続いて、settings.pyのSECRET_KEYを適当な文字列に変更。myappなど、不要なsampleアプリを削除し、通常のDjangoプロジェクトを扱うつもりで今までのアプリをひとつずつ突っ込んでいった。基本的に、settings.pyを修正することと、models.pyにてBaseModelを継承しているmodelをdb.Modelを継承するように修正することくらいで完了。
記録のため、つまづいたところや気になったところをメモしておく。
"python manage.py runserver"を実行すると、
ImportError: No module named app-engine-patch-sample-1.1beta1というエラーが発生。ちなみに"&app-engine-patch-sample-1.1beta1quot;というのは、ダウンロードしたzipファイルを展開したあとにrenameしたフォルダ名。気になったのでこのフォルダ名を"test"などに置き換えてみると、このエラーが消えた。プロジェクトのフォルダ名に制限があったとは・・・。
ここには、Googleアカウントを使う場合には、SessionMiddlewareは不要、と書かれているが、admin権限以外でadminページにアクセスするとエラーが発生してしまう。admin権限ユーザ以外がadminページを触ることはない、と考えればSessionMiddlewareを無効にしていても実害はなさそう。
Djangoのflatpagesアプリが使えるとのことだけど、adminページからflatpageを作成してそのURLにアクセスしても、Page not foundになってしまう。時間ができたら調査する。
settings.pyに含まれている"MEDIA_VERSION"はJavaScriptやCSSを圧縮するツールであるMediaGeneratorで利用するもの。不要であればINSTALLED_APPSからmediautilsを削除すればよい。
個人的には、例えばTEMPLATE_DIRS = tuple([os.path.join(dir, 'templates') for dir in MAIN_DIRS])
のように設定されている。これをsettings.pyにてTEMPLATE_DIRS = (os.path.join(ROOT_PATH, ''))
のように上書き指定してやれば良い。このあたりは好みの問題。
Google App Engine Helperとapp-engine-patchでは、デフォルトでdatastoreにentityを作る際のnamingが異なるので、settings.pyに
DJANGO_STYLE_MODEL_KIND = Falseを追加する。これがないと、今まで蓄えたデータが見えなくなってしまう。
しばらく使っているうちに、index.yamlがまったく更新されていないことに気がついた。runserverのログを見ると、
INFO:root:Detected manual index.yaml, will not update.と出ている。しばらくGoogleで検索してみて、ようやくたどり着いたのがこのページ。改行コードが'\r\n'になっているとindex.yamlが更新されないらしい。確認してみると、確かにDOSの改行コードになっていた。ダウンロードしたzipファイルに含まれているものがそもそもこうなっている。UNIX改行コードに変更して、無事にindex.yamlが更新されるようになった。ちなみに、この件報告したら早速修正してもらえた。
追記: どうやらapp-engine-patchは開発を止めてしまったようだ。ということで、このサイトではapp-engine-patchの利用を停止。Google App Engine SDK 1.2.5から追加されたDjango 1.1サポートを利用するようにした。