Created
November 29, 2010 09:16
-
-
Save amcgregor/719763 to your computer and use it in GitHub Desktop.
A comparison of a stupid/simple filter and its implementation as middleware.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# You have a simple application: | |
def hello(environ): | |
status = b'200 OK' | |
headers = [(b'Content-Type', b'text/plain')] | |
body = b"Hello " + environ['wsgiorg.routing_args'][1]['name'] + b'!' | |
headers.append((b'Content-Length', len(body).encode('ascii'))) | |
return status, headers, [result] | |
# Example (really crappy) filter to process GET arguments: | |
def get_filter(environ): | |
environ['wsgiorg.routing_args'] = [[], dict()] | |
args = environ['wsgiorg.routing_args'][1] | |
for chunk in environ['QUERY_STRING'].split(b'&'): | |
name, _, value = chunk.partition(b'=') | |
# need to process value a bit | |
args[name] = value | |
# Example usage | |
HTTPServer(None, 8080, app=hello, ingress=[get_filter]).serve() | |
# The same as middleware: | |
def get_middleware(app): | |
def inner(environ): | |
environ['wsgiorg.routing_args'] = [[], dict()] | |
args = environ['wsgiorg.routing_args'][1] | |
for chunk in environ['QUERY_STRING'].split(b'&'): | |
name, _, value = chunk.partition(b'=') | |
# need to process value a bit | |
args[name] = value | |
return app(environ) | |
# Example usage. | |
HTTPServer(None, 8080, app=get_middleware(hello)).serve() | |
# The problem with middleware: | |
HTTPServer(None, 8080, app=\ | |
get_middleware( | |
post_middleware( | |
cookie_middleware( | |
session_middleware( | |
db_middleware( | |
hello | |
) | |
) | |
) | |
) | |
) | |
).serve() | |
# The only callable that -should- be middleware in that stack is db_middleware, as it needs to | |
# trap exceptions within the application! Middleware stacks are often even deeper than this! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment