GAEのgoogle.appengine.ext.webapp.WSGIApplicationはRailsでおなじみの_methodパラメータによるメソッドエミュレーションをやってくれないのでREST厨涙目ということで、そこだけのMiddlewareを書いてみました。
import webob
class MethodEmulator(object):
def __init__(self, application):
self.application = application
def __call__(self, environ, start_response):
req = webob.Request(environ)
if req.params.has_key('_method'):
method = req.params['_method'].upper()
if method in ['PUT', 'DELETE']:
environ['REQUEST_METHOD'] = method
return self.application(environ, start_response)
HEAD, OPTIONS, TRACEやWEBDAVのメソッドも何か怖いので無し。
application = WSGIApplication([('/', MainHandler)])
run_wsgi_app(MethodEmulator(application))
こんな感じで被せて使う。
Rackだとuse MethodEmulatorって感じだったけどRuby始めたばっかりで、
「useなんて予約語無いじゃないか!」
とか迷ったので明示的なのも分かりやすくて良いですね。