AppEngine/PythonでDjangaeを試した

TokyoDjangoMeetup #6でAppEngineでDjango Adminを動かしたくて調査した記録です。

結論

  • Django non-relよりDjangaeのほうがよさそう
  • 制限付きではあるがDjango 1.8が、モデルAPIがそのまま動作する
  • Django Adminが動く!!!
  • Django REST Frameworkも動く!!!
  • settings.DJANGAE_ADDITIONAL_MODULES経由で他のランタイムで開発してるモジュールも一緒に動かせる、たとえば一部だけAppEngine/Goで開発とか

検証コード

ここにあります。

https://github.com/jbking/djangae-with-drf-demo

経緯

  • AppEngine/Pythonには前からDjangoサポートはあるのだがバージョンが1.5
  • しかもモデルAPIがAppEngineのDatastore APIやNDB Datastore APIを強いられる
  • いちおうCloud SQLでMySQLという選択肢はある
  • Django Adminが動かない
  • ModelFormとかももちろん動かない

作業履歴

  • Django non-relでDjango AdminをAppEngine/Pythonでとりあえず動かしたことがあるので詳しく調べ始めた
  • Django non-relはDjangoをforkしており1.7までしかサポートしていないことが判明
  • 世間ではLTSなDjango 1.8がメジャー、暗雲がたちこめはじめる
  • イベント主催者の一人にDjangaeを紹介される
  • ドキュメントを読んでみたら気になる一文が

https://djangae.readthedocs.org/en/latest/db_backend/

Previously, in order to use Django's ORM with the App Engine Datastore, django-nonrel was required, along with djangoappengine. That's now changed. With Djangae you can use vanilla Django with the Datastore.
ローカルで動かす
$ git clone git@github.com:potatolondon/djangae-scaffold.git ${somewhere}
$ cd ${somewhere}
$ ./install_deps
$ ./rename_scaffold_app ${somewhere}
$ python manage.py checksecure --settings=${somewhere}.settings_live
$ python manage.py runserver

デプロイ
$ vim app.yaml
$ appcfg.py update ./
  • 動いた
  • 調子にのってDjango REST Frameworkを動かしてみた
  • 動いた

質問された未検証項目

  • テストって動くのか?

AppEngine/Goをモジュールとして扱う

sitepackages/google_appengine/google/appengine/tools/devappserver2/go_application.pyのGOROOTをAppEngine Go SDKのに変えたりごにょごにょしたら、そのままモジュールと認識されてマルチランタイムでの開発(Datastore共有とか)できてるので最強っぽい

# GOROOT = os.path.join(_SDKROOT, 'goroot')
GOROOT = '/usr/local/go_appengine/goroot'