Pregunta

Estoy buscando un middleware wsgi que pueda manipular aplicaciones wsgi y que me permita monitorear las solicitudes http entrantes y salientes y los campos de encabezado.

Algo así como encabezados en vivo de Firefox, pero para el lado del servidor.

¿Fue útil?

Solución

El software intermedio

from wsgiref.util import request_uri
import sys

def logging_middleware(application, stream=sys.stdout):
    def _logger(environ, start_response):
        stream.write('REQUEST\n')
        stream.write('%s %s\n' %(
            environ['REQUEST_METHOD'],
            request_uri(environ),
        ))

        for name, value in environ.items():
            if name.startswith('HTTP_'):
                stream.write('    %s: %s\n' %(
                    name[5:].title().replace('_', '-'),
                    value,
                ))
        stream.flush()
        def _start_response(code, headers):
            stream.write('RESPONSE\n')
            stream.write('%s\n' % code)
            for data in headers:
                stream.write('    %s: %s\n' % data)
            stream.flush()
            start_response(code, headers)
        return application(environ, _start_response)
    return _logger

La prueba

def application(environ, start_response):
    start_response('200 OK', [
        ('Content-Type', 'text/html')
    ])
    return ['Hello World']

if __name__ == '__main__':
    logger = logging_middleware(application)
    from wsgiref.simple_server import make_server
    httpd = make_server('', 1234, logger)
    httpd.serve_forever()

Ver también el depurador de trabajo Armin escribió que es útil para la depuración interactiva.

Otros consejos

No debería ser demasiado difícil escribirlo usted mismo, siempre y cuando solo necesite los encabezados.Trata eso:

import sys

def log_headers(app, stream=None):
    if stream is None:
        stream = sys.stdout
    def proxy(environ, start_response):
        for key, value in environ.iteritems():
            if key.startswith('HTTP_'):
                stream.write('%s: %s\n' % (key[5:].title().replace('_', '-'), value))
        return app(environ, start_response)
    return proxy

Si desea registros estilo Apache, intente pegar.translogger

Pero para algo más completo, aunque no en una ubicación muy útil o estable (tal vez copiarlo en su fuente) es wsgifilter.proxyapp.DebugHeaders

Y escribiendo uno usando WebOb:

import webob, sys
class LogHeaders(object):
    def __init__(self, app, stream=sys.stderr):
        self.app = app
        self.stream = stream
    def __call__(self, environ, start_response):
        req = webob.Request(environ)
        resp = req.get_response(self.app)
        print >> self.stream, 'Request:\n%s\n\nResponse:\n%s\n\n\n' % (req, resp)
        return resp(environ, start_response)

La documentación mod_wsgi proporciona varios consejos sobre depuración que son aplicables a cualquier mecanismo de alojamiento WSGI y no solo a mod_wsgi.Ver:

http://code.google.com/p/modwsgi/wiki/DebuggingTechniques

Esto incluye un middleware WSGI de ejemplo que captura solicitudes y respuestas.

Mi proyecto WebCore tiene un poco de middleware que registra todo el entorno WSGI (por lo tanto, sesiones de vaso de precipitados, encabezados, etc.) para la solicitud entrante, encabezados para las respuestas salientes, así como información de rendimiento en una base de datos MongoDB.La sobrecarga promedio es de alrededor de 4 ms.

El módulo se eliminó del paquete principal, pero aún no se ha integrado en el suyo.La versión actual a partir de esta respuesta está disponible en el historial de Git:

http://github.com/GothAlice/WebCore/blob/cd1d6dcbd081323869968c51a78eceb1a32007d8/web/extras/cprofile.py

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top