As we learned in the introduction, WSGI middleware components can be chained together since each middleware, application pair is also a valid WSGI application.
In the example given, the Session class changes the environ dictionary to provide the application with more functionality. It could also have been chained with an Auth middleware component to provide auth functionality as shown below:
def exampleApplication(environ, start_response):
if not environ.has_key('imaginaryAuth'):
raise Exception{'No auth module found')
if environ['superSession'].has_key('visited'):
text = "You have already visited!"
else:
environ['superSession']['visited'] = 1
text = "This is your first visit."
start_response('200 OK', [('Content-type','text/plain')])
return [text]
class Session:
def __init__(self, application):
self.application = application
def __call__(self, environ, start_response):
if "superSession" not in environ:
import superSession
environ["superSession"] = superSession.session()
return self.application(environ, start_response)
class Auth:
def __init__(self, application):
self.application = application
def __call__(self, environ, start_response):
if "imaginaryAuth" not in environ:
import imaginaryAuth
environ["imaginaryAuth"] = imaginaryAuth.auth()
return self.application(environ, start_response)
application = Auth(Session(exampleApplication))
Middleware classes usually do one of four things or a combination of them:
environ dictionary
status
headers
The most common use is to alter the environ dictionary in order to provide more functionality but here are some other ways in which they can be used.
'403 Forbidden' status and instead display a sign in page, setting a new status of '200 OK', new headers and of course a different result containg the HTML of the sign in page.