import sys import traceback def simple_app(environ, start_response): """Simplest possible application object""" status = '200 OK' response_headers = [('Content-type','text/plain')] start_response(status, response_headers) return ['Hello world!\n'] class AppClass: def __init__(self, environ, start_response): self.environ = environ self.start = start_response def __iter__(self): status = '200 OK' response_headers = [('Content-type','text/plain')] self.start(status, response_headers) yield "Hello world!\n" ################ ## Middleware ## ################ class UpperIter: def __init__(self,result,transform_ok): if hasattr(result,'close'): self.close = result.close self._next = iter(result).next self.transform_ok = transform_ok def __iter__(self): return self def next(self): if self.transform_ok: return self._next().upper() else: return self._next() class Upperator: transform = False def __init__(self, application): self.application = application def __call__(self, environ, start_response): transform_ok = [] def start_upper(status,response_headers,exc_info=None): # Reset ok flag, in case this is a repeat call transform_ok[:]=[] for name,value in response_headers: if name.lower()=='content-type' and value=='text/plain': transform_ok.append(True) # Strip content-length if present, else it'll be wrong response_headers = [(name,value) for name,value in response_headers if name.lower()<>'content-length' ] break write = start_response(status, response_headers,exc_info) if exc_info: try: write('Errortype:%s\nValue:%s\nTraceback:%s'% (exc_info[0], exc_info[1], traceback.format_tb(exc_info[2])) ) finally: exec_info = None if transform_ok: def write_upper(data): write(data.upper()) return write_upper else: return write return UpperIter(self.application(environ,start_upper), transform_ok) def e_app(environ, start_response): try: # regular application code here status = "200 Froody" response_headers = [("content-type","text/plain")] start_response(status, response_headers) a = 1/0 return ["normal body goes here"] except: # XXX should trap runtime issues like MemoryError, KeyboardInterrupt # in a separate handler before this bare 'except:'... status = "500 Oops" response_headers = [("content-type","text/plain")] start_response(status, response_headers, sys.exc_info()) return ["\nerror body goes here"] from pprint import pformat import cgi formstr = """
name: %s pass: %s
""" def form_app(environ, start_response): status = "200 Froody" response_headers = [("content-type","text/html")] form = cgi.FieldStorage(fp=environ['wsgi.input'], environ= environ, keep_blank_values=0) start_response(status, response_headers) name, passwd = '', '' if form.has_key('username'): name = form['username'].value if form.has_key('passwd'): passwd = form['passwd'].value return [formstr%(name, passwd)] uapp = Upperator(simple_app) eapp = Upperator(e_app)