2010-03-05 13 views
3

J'ai un middleware WSGI qui doit capturer l'état HTTP (par exemple 200 OK) que les couches internes du middleware retournent en appelant start_response. Actuellement, je fais ce qui suit, mais en abusant d'une liste ne semble pas être la « bonne » solution pour moi:Quelle est la manière appropriée d'intercepter WSGI start_response?

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

La raison de l'abus de liste est que je ne peux pas attribuer une nouvelle valeur à la l'espace de noms parent à partir d'une fonction entièrement contenue.

Répondre

3

Vous pouvez affecter l'état en tant que champ injecté de la fonction local_start elle-même plutôt que d'utiliser la liste status. J'ai utilisé quelque chose de similaire, fonctionne bien:

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 
+0

C'est une solution géniale! Je vous remercie. – amcgregor