Google App Engine は WSGI 互換のアプリケーションなら動かすことができます。Django は WSGI をサポートしているので、Google App Engine 上で動くDjango アプリケーションを新たに書く事が(既存のアプリケーションを移植する事も)できます。
この記事では、公式の Django チュートリアルから Polls アプリケーションを作るはじめの部分を再現する事で、新しく Django プロジェクトを始めて、Google App Engine 上で動かすやり方をご案内します。各ステップで App Engine 環境のために必要な変更点をハイライト表示しています(訳注: 実際はしていません)。
はじめる前に、Python 2.5 と Google App Engine SDK がインストールしてある事を確かめてください。それからこの記事ではあなたに Django 自体の経験があるものと想定しています。
Google App Engine の環境と、Django アプリケーションが期待する環境とは、二つの点で大きく異なっています。
私たちは、これらの違いの大部分について心配しないで済むようなヘルパーを書きました。このヘルパーは Django のうち App Engine と非互換な部分を別の実装に置き換える事で動作します。
ヘルパーは http://code.google.com/p/google-app-engine-django にあるオープンソースプロジェクトのページからダウンロードできます。
ダウンロードして、 mysite というディレクトリ内にアーカイブの内容を展開します。
ディレクトリ内には、Django の一般的なプロジェクト構造(settings.py, urls.py, など)と、appengine_django というサブディレクトリ(Django 用語だと application)があります。これが Django と Google App Engine 環境をつなぐ仕事をするヘルパーです。
ヘルパーは Google App Engine SDK にアクセスする必要があります。Windows か Mac OS 上で、Google が出している(訳注: Google App Engine SDK の)インストーラを使った場合は、次のステップ(環境の動作確認)に進めます。ヘルパーはインストーラがどこに SDK を配置するか知っていて、自動的にそこからインポートを行います。
Linux をお使いであるか、Windows や Mac OS 上で zip 形式ソース配布の SDK を使っている場合は、上記で作成した mysite ディレクトリ内に、.google_appengine ディレクトリ(はじめのピリオドに注意です。これは隠しディレクトリです。)として、展開したSDKをコピーするかシンボリックリンクを作る必要があるでしょう。
Linux か Mac OS であれば、次のようなコマンドでこれを達成出来ます。コマンドは mysite ディレクトリの中で実行してください。
ln -s /path/to/google_appengine .google_appengine
環境が正しく設定されたか確かめるには、サーバをスタートさせましょう。mysite ディレクトリ内に居る事を確認して、次のコマンドをタイプしてください:
python manage.py runserver
次のような出力があるでしょう
INFO:root:Checking for updates to the SDK. INFO:root:The SDK is up to date. INFO:root:Running application appengine-django-example on port 8080: http://localhost:8080
ブラウザで http://localhost:8080/ にアクセスすると、Django のウェルカムページが表示されるでしょう。この裏でヘルパーは Django デフォルトの runserver コマンドを上書きする恰好で、Google App Engine SDK が提供する dev_appserver を実行するように置き換えているのです。
ヘルパーに含まれる Django のテストスイートを実行する事もできます。
python manage.py test ................................................. ---------------------------------------------------------------------- Ran 49 tests in 3.760s
app.yaml を好きなエディタで開いて application と書かれた行を、あなたのアプリケーション名に合わせて書き換えてください。例:
application: mysite
ヘルパーはこのプロジェクト専用の開発用データストアをセットアップするためにこの情報を必要とします。
次にあなたのプロジェクト内部にモデル、ビュー、テストを含んだ Django アプリケーション を作成する必要があります。これには manage.py startapp を使います:
python manage.py startapp polls
期待どおりに polls ディレクトリができあがり、中は下記のとおりです:
polls/ __init__.py models.py views.py
polls アプリには二つのモデルがあります: polls と choices です。これらのモデルを作成するにはヘルパーが提供するモデルクラスと Google App Engine のデータストアプロパティを使用します。標準の Django モデルとプロパティは動きません。これらのモデルは、実際には Django のモデルクラスを使っていないにも関わらず、ヘルパーが面倒を見てくれるおかげで、Django モデルのように
polls/models.py を下記のように編集しましょう:
from appengine_django.models import BaseModel
from google.appengine.ext import db
class Poll(BaseModel):
question = db.StringProperty()
pub_date = db.DateTimeProperty('date published')
class Choice(BaseModel):
poll = db.ReferenceProperty(Poll)
choice = db.StringProperty()
votes = db.IntegerProperty()
Google App Engine を使う際には明示的にデータベーステーブルを作成する必要はありません。それゆえ、sql*, syncdb や validate コマンドは不必要です。ヘルパーは manage.py からこれらを取り除いていますので、試しに使いたくなる事も無いでしょう。
モデルを有効にするためにやらなければならないのは、settings.pyを編集して、INSTALLED_APPS の中に 'polls' を記述するだけです。
ヘルパーモジュールは Python のインタラクティブシェルをサポートしており、このシェルは開発用 appserver と同じ開発用データストアにアクセスできるように設定されています。Python シェルを使うにはおなじみのコマンドを使います:
python manage.py shell
Python のインタラクティブシェルは、appserver で動く場合と同じように制限されているわけではありません。
Django アドミンサイトは SQL データベースの概念と密接に結びついており、Google App Engine ではサポートされません。開発用 appserver により、自動的に代わりのアドミンインターフェースが /_ah/admin で提供されます - URLの例です: http://localhost:8080/_ah/admin
URL コンフィグと view の関数は、Google App Engine で動かす場合でも通常どおり動きます。モデルが Django のモデルクラスを継承していないので Django の Form クラスを使う事はできません。その代わりに、Google App Engine SDK により App Engine 互換の代用品が google.appengine.ext.db.djangoforms として提供されています。この djangoforms モジュールは 完全な Django プロジェクトでも使えます。
ここまでくれば、今までに述べたテクニックを使ってアプリケーションの開発を進める事ができるでしょう。記事の残りではもう少し詳しく、ヘルパーの実装や、テストの方法、また fixture を読み込み/保存したりするための高度なテクニックなどについて解説します。
ヘルパーは Django の最新安定版(0.96)と現在の開発リリース版をサポートしています。最新安定版で満足であれば何も追加でインストールする必要はありません。いつも通り、ただ Django モジュールをインポートしてください。
開発版を使うには、アプリケーションと一緒に Django をアップロードする必要があります。単純にソースツリーをチェックアウトして、Django をアプリケーションのソースディレクトリにコピーしてください:
my_application/app.yaml my_application/main.py my_application/django/*
ファイル数を減らすために、以下のものは安全に消せます:
django/bin django/contrib/admin django/contrib/auth django/contrib/databrowse
もし上記のようにして Django 0.97 を使用していて、また http://appengine.google.com/ でアプリケーションの登録を済ませているなら、manage.py の update オプションを使用すれば、下記のように簡単にアプリケーションをアップロードできます。
python manage.py update
これは Google App Engine SDK の appcfg.py コマンドを直接実行するのと同じ事です。また、rollback と vacuum_indexes コマンドも同様に実行できます。ただし(Google App Engine SDK に含まれている) Django 0.96 をそのまま使用している場合は manage.py からこれらのコマンドを使うことはできません。
ヘルパーが提供している app.yaml 設定ファイルでは、静的ファイル以外に対してのリクエストは、main.py で処理するように appserver に指定しています。main.py にはヘルパーをロードして Django の WSGI ハンドラを動かすようなコードが含まれています。
CSS や イメージ、その他の静的ファイルは my_application/static に置いてください。
ヘルパーは Django から使用するために 'appengine' というデータベースバックエンド を提供します。このバックエンドは appserver 以外の場所でコードが実行された時(例えばインタラクティブシェルを使う時や、テスト実行時、また fixture のロード・ダンプ時などです)に、データストアが正しく初期化されるように面倒を見てくれます。
manage.py の reset か flush コマンドを使う事で、開発用データストアをクリアする事ができます。
注: ヘルパーはそれぞれの Django プロジェクト内部に別々のデータストアを設定します。プロジェクト毎のデータストアの保存先パスは、Google App Engine SDK に付いてくる dev_appserver.py が使用するデフォルトの保存先パスとは異なります。
前の段落でちらっと述べたように、ヘルパーは Django の標準テスト機構を使えるようにしてくれる他、実行するテスト用のデータが含まれる fixture を作成する事も可能にします。
ヘルパーが提供する BaseModel クラスを継承したモデルのシリアライズ・デシリアライズは、YAML、JSON そして XML 形式をサポートしています。
モデル中の ReferenceProperty メンバは、そのモデルインスタンスに結びついた Key の str() 表現を使用してシリアライズされます。
テストと Fixture を行うには通常と同じく manage.py の test、loaddata そして dumpdata コマンドを使います。
ヘルパーでは Google App Engine に非互換な設定を変更・削除してあります。Django のデフォルト設定からの変更点を知るには、diffsettings コマンドを使います:
python manage.py diffsettings DATABASE_ENGINE = 'appengine' DEBUG = True INSTALLED_APPS = ['appengine_django'] MIDDLEWARE_CLASSES = () ROOT_URLCONF = 'urls' ### SETTINGS_MODULE = 'mysite.settings' ### SITE_ID = 1 ### TEMPLATE_DEBUG = True TIME_ZONE = 'UTC'
現在のヘルパーモジュールでは、Django と Google App Engine 環境をつなぐためにできる事のうち、ほんの一部分しか提供していません。機能追加の要望や、ヘルパーモジュールへのパッチがあるのであれば、是非以下に記載した、プロジェクトサイトのバグレポートに登録してください。http://code.google.com/p/google-app-engine-django/issues/entry