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なんて予約語無いじゃないか!」

とか迷ったので明示的なのも分かりやすくて良いですね。

Comments


Option