2010-10-09

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

今回のお題は、GAE が提供する「データストア」の使い方を調査すること。ただし、Blogger Glass に追加しようとしているユーザごとの設定機能に必要なのは、User.user_id() をキーとしてデータ実体を作成・抽出・更新する方法だ。複雑なクエリに関しては今のところ不要。

とりあえず、サンプルを作ったので貼っておく。

#!/usr/bin/env python
#
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import db
import datetime
import logging
from handler.view import ViewHandler
from handler.edit import EditHandler
from handler.delete import DeleteHandler
class Settings(db.Model):
user = db.UserProperty()
blog_id = db.StringProperty()
last_modified = db.DateTimeProperty(auto_now_add=True)
def get_settings(user_id):
key = db.Key.from_path('Settings', user_id)
settings = db.get(key)
if not settings:
settings = Settings(key_name=user_id)
return settings
class MainHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
self.response.out.write("<html>")
self.response.out.write("<head><title>User Settings</title></head>")
self.response.out.write("<body>")
# current settings
self.response.out.write("<h1>User Settings</h1>")
if user:
self.response.out.write("<ul>")
self.response.out.write("<li>User name: " + user.nickname() + "</li>")
settings = get_settings(user.user_id())
if settings.blog_id:
self.response.out.write("<li>Blog ID: " + settings.blog_id + "</li>")
if settings.last_modified:
self.response.out.write("<li>Last modified: " + str(settings.last_modified) + "</li>")
self.response.out.write("</ul>")
# form
self.response.out.write("""
<form action='/settings' method='post'>
<div>Blog ID: <input name='blog_id' type='text' cols='60' /></div>
<div><input type='submit' value='Save Settings' /></div>
</form>
"""
)
# navigation
self.response.out.write("<div>")
if not user:
self.response.out.write("<a href='" + users.create_login_url(self.request.uri) + "'>Login</a>")
else:
self.response.out.write("<a href='" + users.create_logout_url(self.request.uri) + "'>Logout</a>")
self.response.out.write("</div>")
self.response.out.write("</body></html>")
class SettingsHandler(webapp.RequestHandler):
def post(self):
user = users.get_current_user()
if user:
settings = get_settings(user.user_id())
settings.blog_id = self.request.get('blog_id')
settings.last_modified = datetime.datetime.now()
settings.put()
self.redirect('/')
else:
logging.debug("redirect to login panel.")
self.redirect(users.create_login_url('/'))
def main():
application = webapp.WSGIApplication([('/', MainHandler),
('/settings', SettingsHandler)
],
debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
view raw main.py hosted with ❤ by GitHub

ログインしていなければ「Login」というリンクだけの画面が表示され、リンクをたどりログインすればユーザごとに設定した「Blog ID」とその更新日時が表示される。また、同時に「Blog ID」を入力するフォームも表示されているので、ID を入力し「Save Settings」ボタンを押せば、ID の値が更新される。つまり、Blogger Glass に追加しようとしている「ユーザごとの設定」機能の核となる部分はここにふくまれているわけだ。

このコードで肝心なのは、Settings クラスの定義と、def_settings 関数の内部で、User.user_id() の値をデータストアのキーとしてデータの実体(entity)を作成、あるいは抽出しているところだ。

参考文献

Programming Google App Engine
Dan Sanderson
Oreilly & Associates Inc ( 2009-11-15 )
ISBN: 9780596522728

User.user_id() をキーにする方法は Example 2-5 を参考にした。

関連リンク

関連記事

0 件のコメント:

コメントを投稿