今回のお題は、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() |
ログインしていなければ「Login」というリンクだけの画面が表示され、リンクをたどりログインすればユーザごとに設定した「Blog ID」とその更新日時が表示される。また、同時に「Blog ID」を入力するフォームも表示されているので、ID を入力し「Save Settings」ボタンを押せば、ID の値が更新される。つまり、Blogger Glass に追加しようとしている「ユーザごとの設定」機能の核となる部分はここにふくまれているわけだ。
このコードで肝心なのは、Settings
クラスの定義と、def_settings
関数の内部で、User.user_id()
の値をデータストアのキーとしてデータの実体(entity)を作成、あるいは抽出しているところだ。
参考文献
Oreilly & Associates Inc ( 2009-11-15 )
ISBN: 9780596522728
User.user_id()
をキーにする方法は Example 2-5 を参考にした。
関連リンク
- データストアの使用 (GAE 公式ドキュメントより)
- Python Datastore API (同上)