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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top