Google App Engine Helper for Django を使う

Matt Brown
May 2008
翻訳 Takashi Matsuo <tmatsuo@shehas.net> 2008年6月11日

はじめに

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 の環境を理解する

Google App Engine の環境と、Django アプリケーションが期待する環境とは、二つの点で大きく異なっています。

  1. Google App Engine は SQL データベースを提供しないので、Django の標準モデルクラスを使う事はできない。
  2. 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 へのアクセス

ヘルパーは 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 アプリケーションの作成

次にあなたのプロジェクト内部にモデル、ビュー、テストを含んだ 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 モデルのように見え、また 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*, syncdbvalidate コマンドは不必要です。ヘルパーは manage.py からこれらを取り除いていますので、試しに使いたくなる事も無いでしょう。

モデルを有効にするためにやらなければならないのは、settings.pyを編集して、INSTALLED_APPS の中に 'polls' を記述するだけです。

API で遊んでみる

ヘルパーモジュールは Python のインタラクティブシェルをサポートしており、このシェルは開発用 appserver と同じ開発用データストアにアクセスできるように設定されています。Python シェルを使うにはおなじみのコマンドを使います:

python manage.py shell

Python のインタラクティブシェルは、appserver で動く場合と同じように制限されているわけではありません。

Django アドミンサイト

Django アドミンサイトは SQL データベースの概念と密接に結びついており、Google App Engine ではサポートされません。開発用 appserver により、自動的に代わりのアドミンインターフェースが /_ah/admin で提供されます - URLの例です: http://localhost:8080/_ah/admin

Views, Forms と URLs

URL コンフィグと view の関数は、Google App Engine で動かす場合でも通常どおり動きます。モデルが Django のモデルクラスを継承していないので Django の Form クラスを使う事はできません。その代わりに、Google App Engine SDK により App Engine 互換の代用品が google.appengine.ext.db.djangoforms として提供されています。この djangoforms モジュールは 完全な Django プロジェクトでも使えます。

開発開始です

ここまでくれば、今までに述べたテクニックを使ってアプリケーションの開発を進める事ができるでしょう。記事の残りではもう少し詳しく、ヘルパーの実装や、テストの方法、また fixture を読み込み/保存したりするための高度なテクニックなどについて解説します。

Django のバージョンについて

ヘルパーは 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.pyupdate オプションを使用すれば、下記のように簡単にアプリケーションをアップロードできます。

python manage.py update

これは Google App Engine SDK の appcfg.py コマンドを直接実行するのと同じ事です。また、rollbackvacuum_indexes コマンドも同様に実行できます。ただし(Google App Engine SDK に含まれている) Django 0.96 をそのまま使用している場合は manage.py からこれらのコマンドを使うことはできません。

WSGI ハンドラを動かす

ヘルパーが提供している app.yaml 設定ファイルでは、静的ファイル以外に対してのリクエストは、main.py で処理するように appserver に指定しています。main.py にはヘルパーをロードして Django の WSGI ハンドラを動かすようなコードが含まれています。

CSS や イメージ、その他の静的ファイルは my_application/static に置いてください。

App Engine でデータベースバックエンドを使う

ヘルパーは Django から使用するために 'appengine' というデータベースバックエンド を提供します。このバックエンドは appserver 以外の場所でコードが実行された時(例えばインタラクティブシェルを使う時や、テスト実行時、また fixture のロード・ダンプ時などです)に、データストアが正しく初期化されるように面倒を見てくれます。

manage.pyresetflush コマンドを使う事で、開発用データストアをクリアする事ができます。

注: ヘルパーはそれぞれの Django プロジェクト内部に別々のデータストアを設定します。プロジェクト毎のデータストアの保存先パスは、Google App Engine SDK に付いてくる dev_appserver.py が使用するデフォルトの保存先パスとは異なります。

テストと Fixture

前の段落でちらっと述べたように、ヘルパーは Django の標準テスト機構を使えるようにしてくれる他、実行するテスト用のデータが含まれる fixture を作成する事も可能にします。

ヘルパーが提供する BaseModel クラスを継承したモデルのシリアライズ・デシリアライズは、YAML、JSON そして XML 形式をサポートしています。

モデル中の ReferenceProperty メンバは、そのモデルインスタンスに結びついた Keystr() 表現を使用してシリアライズされます。

テストと Fixture を行うには通常と同じく manage.pytestloaddata そして dumpdata コマンドを使います。

Django Settings の更新

ヘルパーでは 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