GAEpでiPhone向けWebアプリを作る (8)続・リクエストハンドラをを実装していく
前回の続きです。
実装は簡単なのに話しが長くなってきて、いつまで続くのか不安です。
今回ここで作ったToDo アプリは、スケッチ用に作ってみたものですが、よくよく見回してみると ToDo アプリはけっこうあるもんです。Gmail も ToDo を管理する用途の機能を持ってるようですし、こないだ発表されたiOS5 でも Reminders と呼ばれる高機能な ToDo 管理アプリが入るようです。
GAEp 上にリクエストハンドラを定義する
前回長くなってやめた残りのふたつを実装していきます。
SaveHandler の実装
SaveHandler では、以下のふたつの仕事をします。
- ToDoアイテムの新規作成
- 既存のToDoアイテムの編集
todo/handlers.py内
import datetime, time import logging from google.appengine.ext import webapp from google.appengine.ext import db from google.appengine.api import users from todo.models import ToDoItem # 〜〜〜 # class SaveHandler(webapp.RequestHandler): # def post(self): logging.debug('SaveHandler#post') user = users.get_current_user() if user: req = self.request itemkey = req.get('todo-key') s_title = req.get('todo-title') s_detail = req.get('todo-detail') s_deadline = req.get('todo-deadline') dt_deadline = datetime.datetime.strptime(s_deadline, '%Y-%m-%d') item = None if(len(itemkey) != 0): item = db.Model.get(itemkey) item.title = s_title item.detail = s_detail item.deadline = dt_deadline; else: item = ToDoItem( owner=user, title=s_title, detail=s_detail, deadline=dt_deadline, ) item.put() return
ユーザがログイン済みかどうかの処理は前回と同じです。
まず、入力の取得。
req = self.request itemkey = req.get('todo-key') s_title = req.get('todo-title') s_detail = req.get('todo-detail') s_deadline = req.get('todo-deadline') dt_deadline = datetime.datetime.strptime(s_deadline, '%Y-%m-%d')
入力は、RequestHandler の request フィールドから get() メソッドで取ることができます。
deadline だけは文字列(YYYY-mm-dd形式)から datetime インスタンスに変換しています。
multipart/form-data がこんなにも簡単に取得できるのは素晴らしいと言うに尽きます。
リクエストが、編集なのか新規作成なのかは、todo-key があるか否かで判別しています。
todo-key がある場合は編集。
item = db.Model.get(itemkey) item.title = s_title item.detail = s_detail item.deadline = dt_deadline;
編集の場合は、キーを元にデータストアから既存のレコード(エンティティ)を取得し、各プロパティに新しい値を代入しています。
todo-key がない場合は新規作成。
item = ToDoItem( owner=user, title=s_title, detail=s_detail, deadline=dt_deadline, )
ToDoItem エンティティをコンストラクタで新規作成しています。
で、最後にコミット。
item.put()
DeletionHandler の実装
最後に DeletionHandler 。ここでは既にある ToDo アイテムを削除します。
todo/handlers.py内
import logging from google.appengine.ext import webapp from google.appengine.ext import db # 〜〜〜 # class DeletionHandler(webapp.RequestHandler): # def post(self): logging.debug('DeletionHandler#post') itemkey = self.request.get('todo-key') item = db.Model.get(itemkey) if(item != None): item.delete() return
特に難しい部分はないです。
todo-key で削除対象のエンティティのキーを取得し、それを削除します。
ここまででサーバサイドの python コードは完了。
次からはクライアントサイドを書いていきます。
参考
Google App Engine については、基本的に Google が公開しているデベロッパーガイドを見ればだいたいのことはわかります。内容もわかりやすいです。
特に、Google App Engine Python については、以下です。
- http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/
- http://code.google.com/intl/ja/appengine/docs/python/overview.html
基本的にはこれらのサイトを見ればほとんどのことはわかりますが、その他に僕は以下の本を参考にしています。
- 作者: Dan Sanderson
- 出版社/メーカー: Oreilly & Associates Inc
- 発売日: 2009/11/15
- メディア: ペーパーバック
- クリック: 29回
- この商品を含むブログ (6件) を見る
和訳も出ているようです。
- 作者: Dan Sanderson,玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/01/24
- メディア: 大型本
- 購入: 5人 クリック: 414回
- この商品を含むブログ (27件) を見る