Middleware de depuración/monitoreo para aplicaciones python wsgi
-
02-07-2019 - |
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.
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: