GoogleAppEngine用フレームワーク「Kay」のgeneric view groupsを使ってみた。

Google App Engine用フレームワーク「Kay」のgeneric view groupsをドキュメント「21. Using generic view groups — Kay v0.10.0 documentation」を参考にして使ってみました。

この機能を使うと、モデルとフォームを用意するだけで自動的にCRUDができる画面を作成してくれます。

インストールから初めて、generic view groupsの使い方を紹介します。

プロジェクトの作成

MercurialでKayを取得します。

$ hg clone https://kay-framework.googlecode.com/hg/ kay

新しいプロジェクトを作成します。

$ python kay/manage.py startproject myproject

続いて、アプリケーションを作成します。

$ cd myproject
$ python manage.py startapp myapp

settings.pyを編集し、myappを登録します。

settings.py

INSTALLED_APPS = (
    'myapp',
)

APP_MOUNT_POINTS = {
    'myapp': '/',
}

generic view groupsを使用する

ここからが本題です。

まずは、モデルを作成します。

myapp/models.py

# -*- coding: utf-8 -*-
# myapp.models

from google.appengine.ext import db

class MyModel(db.Model):
    comment = db.StringProperty()

    def __unicode__(self):
        return self.comment

フォームを作成します。

myapp/forms.py

# -*- coding: utf-8 -*-
from kay.utils.forms.modelform import ModelForm
from myapp.models import MyModel

class MyForm(ModelForm):
    class Meta:
        model = MyModel

URLマッピングを設定します。

myapp/urls.py

# -*- coding: utf-8 -*-
# myapp.urls
from kay import generics

class MyCRUDViewGroup(generics.CRUDViewGroup):
    model = 'myapp.models.MyModel'
    form = 'myapp.forms.MyForm'

view_groups = [MyCRUDViewGroup()]

※2010年5月8日追記
 Kayに「新しいURLマッピングが導入されました。
 URLマッピングの設定は「Kayの新しいURLマッピングによる汎用ビューグループの設定」をご覧ください。

kay.utils.flash.FlashMiddlewareを登録します。

settings.py

MIDDLEWARE_CLASSES = (
    'kay.utils.flash.FlashMiddleware',
)

以上で一通りの設定が完了しました。

開発サーバを起動します。

$ python manage.py runserver

「http://localhost:8080/mymodel/list」にアクセスすると、MyModelの一覧が表示され、登録・修正・削除ができます。

テンプレートファイルをカスタマイズする

テンプレートファイルを変更します。

デフォルトのテンプレートファイルは、kay/_internal/templates/にあるgeneral_list.html・general_show.html・general_update.htmlです。
このファイルをmyapp/templates/にコピーして編集します。

general_list.html => mymodel_list.html
general_show.html => mymodel_list.html
general_update.html => mymodel_update.htm

urls.pyを編集し、テンプレートファイルの位置を設定します。

myapp/urls.py

class MyCRUDViewGroup(generics.CRUDViewGroup):
    model = 'myapp.models.MyModel'
    form = 'myapp.forms.MyForm'
    templates = {
        'show': 'myapp/mymodel_show.html',
        'list': 'myapp/mymodel_list.html',
        'update': 'myapp/mymodel_update.html'
    }

「http://localhost:8080/mymodel/list」にアクセスすると、編集したテンプレートを使用して表示されます。

アクセス制限を行う

アクセス制限の設定を行います。
認証されたユーザーのみ、アクセスできるようにします。

今回は、データストアを利用した認証を使用します。

settings.pyに以下の項目を追加します。

settings.py

INSTALLED_APPS = (
    'kay.auth', #追加
    'myapp',
)
MIDDLEWARE_CLASSES = (
    'kay.sessions.middleware.SessionMiddleware', #追加
    'kay.auth.middleware.AuthenticationMiddleware', #追加
    'kay.utils.flash.FlashMiddleware',
)
AUTH_USER_BACKEND = 'kay.auth.backends.datastore.DatastoreBackend' #追加
AUTH_USER_MODEL = 'kay.auth.models.DatastoreUser' #追加

ユーザーを作成します。

$ python manage.py shell
> from kay.auth import create_new_user
> create_new_user('admin','admin', is_admin=True) #管理者
> create_new_user('user','user', is_admin=False)  #ユーザー

urls.pyのMyCRUDViewGroupのauthorize属性にアクセス制限の設定をします。

myapp/urls.py

class MyCRUDViewGroup(generics.CRUDViewGroup):
    model = 'myapp.models.MyModel'
    form = 'myapp.forms.MyForm'
    authorize = generics.admin_required #管理者のみ
    #authorize = generics.login_required #ログインユーザーのみ
    #authorize = generics.only_owner_can_write #編集は作成者のみ
    #authorize = generics.only_owner_can_write_except_for_admin #編集は作成者または管理者のみ

ログインしていない状態で「http://localhost:8080/mymodel/list」にアクセスすると、ログインフォームが表示されます。
adminでログインすると一覧が表示されますが、userでログインするとアクセス権限がないためにエラーになります。

モデルに作成したユーザーを登録する

モデルに作成したユーザーを登録します。

モデルに作成者を登録するためのプロパティを追加します。

myapp/models.py

# -*- coding: utf-8 -*-
# myapp.models
from google.appengine.ext import db
from kay.db import OwnerProperty #追加

class MyModel(db.Model):
    comment = db.StringProperty()
    owner = OwnerProperty() #追加

    def __unicode__(self):
        return self.comment

myapp/forms.py

# -*- coding: utf-8 -*-
from kay.utils.forms.modelform import ModelForm

from myapp.models import MyModel

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        exclude = ('owner',) #追加

「http://localhost:8080/mymodel/list」にアクセスして、新しいデータを登録します。
登録したデータは「http://localhost:8080/_ah/admin/datastore」で確認できます。

新たにデータを登録したとき、ログインしているとログインユーザーがownerに設定されます。
ログインしていないときは、Noneが設定されます。

追記

2010年6月8日 追記
CRUDViewGroup の場所が変更になりました。(参考:CRUDViewGroup を移動しました – kay-users-ja | Google グループ)

変更前 => kay.generics.CRUDViewGroup
変更後 => kay.generics.crud.CRUDViewGroup

コメント

  1. Pingback: Kayのgeneric view groupsのURLマッピングを変更する。 | 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です