Was ist der richtige Weg zu Intercept WSGI start_response?
-
24-09-2019 - |
Frage
Ich habe WSGI Middleware, die Bedürfnisse der HTTP-Status zu erfassen (z 200 OK
), die inneren Schichten der Middleware Rückkehr von start_response
aufrufen. Derzeit gibt es folgende ich tue, aber eine Liste missbrauchen scheint nicht die „richtige“ Lösung für mich zu sein:
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
Der Grund für die Liste Missbrauch ist, dass ich nicht einen neuen Wert zu dem übergeordneten Namespace innerhalb einer vollständig enthaltenen Funktion zuweisen kann.
Lösung
Sie können den Status als injizierten Bereich der local_start
Funktion zuweisen selbst anstatt mit status
Liste. Ich habe etwas ähnliches, funktioniert:
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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow