I have WSGI middleware that needs to capture the HTTP status (e.g. 200 OK) that inner layers of middleware return by calling start_response.  Currently I'm doing the following, but abusing a list doesn't seem to be the “right” solution to me:
class TransactionalMiddlewareInterface(object):
    def __init__(self, application, **config):
        self.application = application
        self.config = config
    def __call__(self, environ, start_response):
        status = []
        def local_start(stat_str, headers=[]):
            status.append(int(stat_str.split(' ')[0]))
            return start_response(stat_str, headers)
        try:
            result = self.application(environ, local_start)
        finally:
            status = status[0] if status else 0
            if status > 199 and status 
The reason for the list abuse is that I can not assign a new value to the parent namespace from within a wholly contained function.
You can assign the status as an injected field of local_start function itself rather than using status list. I used something similar, works fine:
class TransactionalMiddlewareInterface(object):
    def __init__(self, application, **config):
        self.application = application
        self.config = config
    def __call__(self, environ, start_response):
        def local_start(stat_str, headers=[]):
            local_start.status = int(stat_str.split(' ')[0])
            return start_response(stat_str, headers)
        try:
            result = self.application(environ, local_start)
        finally:
            if local_start.status and local_start.status > 199:
                pass
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With