diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-07-19 23:45:57 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-07-19 23:45:57 +0000 |
| commit | 95b14bdd6c911c584d81a33e5ef42a5d67efdfe8 (patch) | |
| tree | df4cab465f8eaffa409e4df6c365be0ce2ff0bfa /repoze/bfg/wsgi.py | |
| parent | ab8048ab0ec363f552320280743323b1fd21ae3f (diff) | |
| download | pyramid-95b14bdd6c911c584d81a33e5ef42a5d67efdfe8.tar.gz pyramid-95b14bdd6c911c584d81a33e5ef42a5d67efdfe8.tar.bz2 pyramid-95b14bdd6c911c584d81a33e5ef42a5d67efdfe8.zip | |
Add wsgiapp decorator.
Diffstat (limited to 'repoze/bfg/wsgi.py')
| -rw-r--r-- | repoze/bfg/wsgi.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/repoze/bfg/wsgi.py b/repoze/bfg/wsgi.py new file mode 100644 index 000000000..4efe40afc --- /dev/null +++ b/repoze/bfg/wsgi.py @@ -0,0 +1,44 @@ +from webob import Response + +def wsgiapp(wrapped): + """ Decorator to turn a WSGI application into a repoze.bfg view callable. + + E.g.:: + + @wsgiapp + def hello_world(environ, start_response): + body = 'Hello world' + start_response('200 OK', [ ('Content-Type', 'text/plain'), + ('Content-Length', len(body)) ] ) + return [body] + + Allows the following view declaration to be made:: + + <bfg:view + view=".views.hello_world" + name="hello_world.txt" + context="*" + /> + + The wsgiapp decorator will convert the result of the WSGI + application to a Response and return it to repoze.bfg as if the + WSGI app were a repoze.bfg view. + """ + def _curried(context, request): + caught = [] + def catch_start_response(status, headers, exc_info=None): + caught[:] = (status, headers, exc_info) + environ = request.environ + body = wrapped(environ, catch_start_response) + if caught: + status, headers, exc_info = caught + response = Response() + response.app_iter = body + response.status = status + response.headerlist = headers + return response + else: + raise RuntimeError('WSGI start_response not called') + _curried.__name__ = wrapped.__name__ + return _curried + |
