Frage

Ich suche eine wsgi Middleware, die ich um eine wsgi Anwendungen verziehen kann und der lasse mich überwachen eingehende und ausgehende HTTP-Anfrage und Header-Felder.

So etwas wie firefox Live-Header, sondern auch für die Server-Seite.

War es hilfreich?

Lösung

Die 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

Der 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()

Siehe auch die werkzeug Debugger Armin schrieb, es ist sehr nützlich für die interaktive Fehlersuche.

Andere Tipps

Das sollte nicht allzu schwer sein, sich zu schreiben, solange Sie nur die Header-Dateien benötigt. Versuchen Sie Folgendes:

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

Wenn Sie Apache-Stil Protokolle wollen, versuchen Sie paste.translogger

Aber für etwas mehr vollständig, wenn auch nicht in einer sehr praktisch oder stabiler Lage (vielleicht ist es in Ihre Quelle kopiert) ist wsgifilter.proxyapp.DebugHeaders

Und das Schreiben eines mit 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)

Die mod_wsgi Dokumentation bietet verschiedene Tipps zur Fehlersuche, die zu jedem WSGI-Hosting-Mechanismus anwendbar sind und nicht nur mod_wsgi. Siehe auch:

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

Dazu gehört ein Beispiel WSGI Middleware, die Anfrage und Antwort einfängt.

Mein WebCore Projekt hat ein bisschen von Middleware, die die gesamte WSGI Umgebung (also Beaker Sitzungen, headers, etc.) für die eingehende Anforderung, headers für ausgehende Antworten, sowie Performance-Informationen zu einer MongoDB Datenbank protokolliert. Durchschnittlicher Aufwand ist um 4 ms.

Das Modul wurde aus dem Kernpaket entfernt, aber noch nicht in seine eigenen integriert. Die aktuelle Version als diese Antwort ist in der Git Geschichte zur Verfügung:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top