2017-01-04 2 views
0

Je travaille sur une application Flask et je veux enregistrer les requêtes entrantes et les réponses sortantes avant que Flask ne démarre. Pour ce faire, j'utilise un wrapper autour de WSGI. Je l'ai pour la partie demande, mais j'ai besoin de quelques indications sur la partie réponse.Enregistrement du corps de la réponse dans le wrapper de requête/réponse Flask WSGI

C'est le code que j'ai jusqu'à présent.

import logging 
import pprint 

from cStringIO import StringIO 

log = logging.getLogger(__name__) 


class WSGIRequestResponseLogging(object): 
    """ 
    This wrapper works independently from Flask and wraps the WSGI application. It shows exactly what 
    request is going in and what response is going out. 

    http://werkzeug.pocoo.org/docs/0.11/wrappers/ 
    """ 

    def __init__(self, app): 
     self._app = app 

    def __call__(self, environ, start_response): 
     log.debug(pprint.pprint(('REQUEST', environ))) 

     if environ.get('REQUEST_METHOD') == 'POST': 
      length = environ.get('CONTENT_LENGTH', '0') 
      length = 0 if length == '' else int(length) 

      if length == 0: 
       log.debug("REQUEST_BODY: EMPTY") 
      else: 
       body = environ['wsgi.input'].read(length) 
       log.debug("REQUEST_BODY: " + body) 
       # After reading the body it is removed, restore it 
       environ['wsgi.input'] = StringIO(body) 

     def log_response(status, headers, *args): 
      log.debug(pprint.pprint(('RESPONSE', pprint.pprint(('RESPONSE', status, headers))))) 

      return start_response(status, headers, *args) 

     return self._app(environ, log_response) 

Comment puis-je consigner le corps de la réponse dans log_response?

Cordialement, nidkil

Répondre

2

Voir l'exemple de code sur le site mod_wsgi à:

Il devrait fonctionner avec tout serveur WSGI.

Si vous utilisiez mod_wsgi-express, cette fonction d'audit est intégrée.

mod_wsgi-express start-server --enable-recorder wsgi.py 
+0

Fonctionne comme un rêve. Merci Graham! – nidkil