Middleware di debug / monitoraggio per applicazioni wsgi python
-
02-07-2019 - |
Domanda
Sto cercando un middleware wsgi che posso deformare attorno ad applicazioni wsgi e che mi consente di monitorare le richieste HTTP in entrata e in uscita e i campi di intestazione.
Qualcosa come le intestazioni live di Firefox, ma per il lato server.
Soluzione
Il middleware
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
Il test
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()
Vedi anche il debugger werkzeug scritto da Armin, è utile per il debug interattivo.
Altri suggerimenti
Non dovrebbe essere troppo difficile scrivere te stesso fintanto che hai solo bisogno delle intestazioni. Prova quello:
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
Se desideri log in stile Apache, prova paste.translogger
Ma per qualcosa di più completo, anche se non in una posizione molto utile o stabile (forse copiarlo nella tua fonte) è wsgifilter.proxyapp.DebugHeaders
E scriverne 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 documentazione di mod_wsgi fornisce vari suggerimenti sul debug applicabili a qualsiasi meccanismo di hosting WSGI e non solo a mod_wsgi. Vedi:
http://code.google.com/p/modwsgi/wiki/DebuggingTechniques
Ciò include un middleware WSGI di esempio che acquisisce la richiesta e la risposta.
Il mio progetto WebCore ha un po 'di middleware che registra l'intero ambiente WSGI (quindi sessioni Beaker, intestazioni, ecc.) per la richiesta in arrivo, intestazioni per le risposte in uscita, nonché informazioni sulle prestazioni in un database MongoDB. Il sovraccarico medio è di circa 4 ms.
Il modulo è stato rimosso dal pacchetto principale, ma non è stato ancora integrato nel suo. La versione attuale a partire da questa risposta è disponibile nella cronologia di Git:
http://github.com/GothAW /blob/cd1d6dcbd081323869968c51a78eceb1a32007d8/web/extras/cprofile.py