GAE で ジャンゴジャンゴジャンゴ アプリケーションを作るとこまで

GAE上で、Django の welcome ページまではなんとか動かすことができたので、次は単純なアプリケーションを作る。

1. アプリケーションの骨格を作成

Eclipse上のソースフォルダをコマンドプロンプトで開き、python manage.py startapp を実行する。

geatest というアプリケーション名にする。

C:\Program Files\eclipse3.4R2

そうすると、アプリケーションの骨格が生成され、以下のような構成になる。

gaetest フォルダ(パッケージ)が作成され、models.py や views.py ファイルが生成される。

gae_django15

2. モデルの作成

モデルクラスを作成する。

Django 標準のモデルクラスは機能しないので、GAE Django ヘルパーが提供するモデルクラスと、GAEのデータストアプロパティを使用する。

Django 標準のモデルクラスは機能しないが、Django モデルと同様に取り扱うことができ、モデルはDjangoに登録される。

from appengine_django.models import BaseModel
from google.appengine.ext import db 

# Create your models here.
class GaeTest(BaseModel):
    message = db.StringListProperty()
    create_date = db.DateTimeProperty('data created')

2.1 モデルの有効化

GAE で Django を使用する場合、RDBMS を使えないので、モデルに対応するテーブル等は作る必要がない。

setting.py のINSTALLED_APPS に記述するだけで、有効となる。

INSTALLED_APPS = (
     'appengine_django',
     'gaetest',  # この行を追加
)

3. ビュー、テンプレートの作成

3.1 URLマッピングの作成

初期表示で、保存されたモデルの内容を表示し、追加ボタンでデータを追加するアプリケーションを想定。

タプルの1つ目にURLのパターン、2つ目にリクエストURLがパターンに一致する場合に処理するハンドラ(ビュー)を記述する。

urlpatterns = patterns('',
    (r'^gaetest/$',     'gaetest.views.index'),  # 初期表示
    (r'^gaetest/add/$', 'gaetest.views.add'),    # データ追加
)

3.2 ビューの作成

上記 urls.py にて、リクエストURLのパターンによって、処理をハンドリングする

リクエストを処理して、レスポンスを返す。このとき、データを取得し、コンテキストに埋め込み(以下の例では、render_to_response に隠蔽されているが)、テンプレートでそれを取り出して描画させる。

from django.shortcuts import render_to_response
from gaetest.models import GaeTest
import datetime

def index(request):
    g_list = GaeTest.gql('order by message')
    return render_to_response('gaetest/index.html', {'g_list':g_list})
    
def add(request):
    msg = request.POST['message']
    g = GaeTest(message=msg, create_date=datetime.datetime.now())
    g.save()
    g_list = GaeTest.gql('order by message')
    return render_to_response('gaetest/index.html', {'g_list':g_list})

3.3 テンプレートの作成

上記ビューで、コンテキストに埋め込まれたオブジェクトを利用して、画面描画を行う。

<form method="post" action="/gaetest/add/">
    message:<input name="message" />
    <input value="add" type="submit" />
</form>
{% if g_list %}
    <ul>
    {% for g in g_list %}
        <li>{{ g.message }}
    {% endfor %}
    </li></ul>
{% else %}
    <p>No GaeTest are available.</p>
{% endif %}    

3.4 ここまでのファイル構成

ここまでの作業で、以下のようなファイル構成になる

gae_django17

4.実行

よっしゃうごいた。

gae_django18

5. その他

5.1 管理ツール

Django の管理ツールは、RDBMS と密接に関連しており、RDBMS を持たないGAEでは、提供されない。

別途、/_ah/admin で管理インターフェースが提供される。

gae_django16

5.2 対話シェル

対話シェルにて、モデルなどのAPIを利用可能。

python manage.py shell コマンドを使用する。

C:\Program Files\eclipse3.4R2\workspace\typea-services\src>python manage.py shell
            :
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from gaetest.models import GaeTest
>>> import datetime
>>> g = GaeTest(message='first gae model.',create_date=datetime.datetime.now())
>>> g.save()
datastore_types.Key.from_path(u'GaeTest', 1, _app_id_namespace=u'typea-services' )

いじょ。