Google App Engine + Kay Framework で RESTful な Web API を作成するとき、データの更新は HTTP メソッドの PUT を使っています。PUT では、更新に必要なデータがリクエストのボディで渡されてきます。データは JSON 形式を使うことが多いです。
リクエストを受け取ったら、ボディから JSON を取り出します。実際は dict ですけど。この dict、値のほとんどが文字列なので、Integer や Boolean への変換が面倒なことこの上ないです。
そこで閃きました。Kay の Form を使えばいいんじゃないか、と。Form は画面に表示しませんが、パラメータの検証機能と、文字列から適切な型への変換機能は使えそうです。
import simplejson from google.appengine.ext import db from kay.utils import forms class Task(db.Model): name = db.StringProperty() completed = db.BooleanProperty() # RESTful API では Form を表示することはないけど、 # 検証と変換のために用意する class TaskForm(forms.Form): name = forms.TextField() completed = forms.BooleanField() def update(request, key): if request.method == "PUT": # リクエストから dict を取り出す dic = simplejson.load(request.stream) # Form を使って値の検証と変換を行う form = TaskForm() if form.validate(dic): # form から取り出す値は変換済み target = Task.get(key) target.name = form["name"] target.completed = form["completed"] target.put() # レスポンスを返すところは省略
simplejson.load で取得したデータも Form で検証できました。値の変換もやってくれます。これは便利だ。