from webob import Request, Response from webob.exc import HTTPException, HTTPNotFound __all__ = ['webob_wrap'] class webob_wrap(object): __slots__ = ('func') def __init__(self, func): self.func = func def __repr__(self): return '%s(%r)' % (self.__class__.__name__, self.func) def __get__(self, ob, type): if not hasattr(self.func, '__get__'): return self return self.__class__(self.func.__get__(ob, type)) def __call__(self, env, start): req = Request(env) try: app = self.func(req) if app is None: app = HTTPNotFound() except HTTPException, exc: app = exc return app(env, start) if __name__ == '__main__': @webob_wrap def app(req): return Response(req.path) assert Request.blank('/test').get_response(app).body == '/test' print app class App(object): @webob_wrap def __call__(self, req): if req.path == '/404': return None elif req.path == '/err': from webob.exc import HTTPInternalServerError raise HTTPInternalServerError() else: return Response('success') assert Request.blank('/').get_response(App()).body == 'success' assert Request.blank('/404').get_response(App()).status_int == 404 assert Request.blank('/err').get_response(App()).status_int == 500