GAEpでiPhone向けWebアプリを作る (8)続・リクエストハンドラをを実装していく

前回の続きです。
実装は簡単なのに話しが長くなってきて、いつまで続くのか不安です。

今回ここで作ったToDo アプリは、スケッチ用に作ってみたものですが、よくよく見回してみると ToDo アプリはけっこうあるもんです。Gmail も ToDo を管理する用途の機能を持ってるようですし、こないだ発表されたiOS5 でも Reminders と呼ばれる高機能な ToDo 管理アプリが入るようです。

GAEp 上にリクエストハンドラを定義する

前回長くなってやめた残りのふたつを実装していきます。

  • 特定の ToDo アイテムの作成/変更API
  • 特定の ToDo アイテムの削除API
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 については、以下です。

基本的にはこれらのサイトを見ればほとんどのことはわかりますが、その他に僕は以下の本を参考にしています。

Programming Google App Engine

Programming Google App Engine

和訳も出ているようです。

プログラミング Google App Engine

プログラミング Google App Engine