Kay の Form を使った RESTful API でのリクエストチェック方法

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 で検証できました。値の変換もやってくれます。これは便利だ。