2010-10-15

GAE アプリでユーザごとの設定を可能にする #5

今回は、新機能のメインとなる、ストレージサービスを使ってユーザごとの設定を保存する部分を作り込む。

データモデルの定義

今のところ「設定画面(ビュー)」で設定可能なのは「Blog ID」のみ。したがって、データモデルもこの ID を保持するプロパティだけで良い。型は文字列(→ StringProperty)。

ただ、管理とデバッグが容易になると想定して、「account」と「mod_time」を加えておく。この 2 つは、画面からは変更できないもので、それぞれ(ログインしている)ユーザ情報と設定が変更された日時を保持するために用いる。

config と setting

「設定画面」は別にして、他の画面では設定項目がストレージサービスに保管されたユーザ設定(の項目)なのか、あるいは(これまでの)構成情報(config.yaml)に書かれたものなのかを意識したくはない。このため util.get_settings() を用意し、ユーザ設定と構成情報をラップすることにした。

具体的には、以下のようにして「Blog ID」にアクセスできる。これで、ログインしていないとき、あるいはログイン中であってもストレージに設定が保管されていないときなどのように、ユーザ設定として「Blog ID」の値が存在しないときは、構成情報(config.yaml)に書き込まれたものが返される。

(設定情報の利用方法)
blog_id = util.get_settings().get('blog_id')

設定画面

画面は「GAE アプリでユーザごとの設定を可能にする #3」に書いた通りの簡単なもの。

リクエストハンドラ(SettingsViewHandler)の get メソッドは、これまでの他のハンドラのものと大差ない。違いは、フィードではなくユーザ設定の内容を表示するという点だけだ。また、このハンドラ内では上述のラッパーを利用せず、データモデルとしてのユーザ設定に直接アクセスしている。

一方、このハンドラはフォームからの POST 要求を扱うための post メソッドが定義されている。「Save Settings」か「Delete Settings」かを判別し、model.UserSettings.put()model.UserSettings.delete() を呼ぶコードになっている。また、「Save Settings」の処理では、データのごく簡単な検証も行っている(空文字列ではないか、と同じ文字列が指定されていないか、の 2 点だけ)。

その他の変更

app.yaml

設定画面はログイン状態であることが前提なので、「login: required」を付けている。また、今回からアプリバージョンを 2 に上げた。

(app.yaml)
application: bloggerglass
version: 2
[...snip...]
handlers:
[...snip...]
- url: /settings/.*
  script: settingsview.py
  login: required
[...snip...]
info.py

設定画面用の SettingsViewInfo の定義を追加した。

main.py と postview.py

これまで構成情報(config.yaml)を参照していた「blog_id」を、上述のようにユーザ設定と構成情報をラップした util.get_settings() 経由で参照するように変更した。

これでバージョン 2

すでに書いたように、今回の配備からapp.yaml 中のアプリバージョンを 1 から 2 に上げた。これには、今回の機能追加ではユーザサービスとストレージサービスを使うようになり今までとは違う、という意味を込めたつもりだ。

バージョンを上げる際には管理コンソールでの操作が必要になる。アプリバーションを上げた app.yaml を配備するだけでは、アプリのデフォルトバージョンは旧バージョンがのままになっている。新バージョンをデフォルトにするには、アプリの管理コンソールから「Administration」>「Versions」を開き、新バージョンを選んで「Make Default」ボタンを押す。

ストレージサービスを使うことで、コードだけではなく、サーバ上に保管されたデータの管理も必要になる。実はまだ、データの保守管理についてはほとんど調べていない。たとえば、データモデルを更新した(プロパティの追加等)場合に、従来のデータをどうやって更新すれば良いのか、データのバックアップやリストアは可能なのか、といったこともわからない。この先、設定可能項目を増やす際には、アプリ外でのデータの取り扱いについて調べる必要がある。

関連リンク

関連記事

0 件のコメント:

コメントを投稿