문제

나는 wsgi 애플리케이션을 둘러볼 수 있고 들어오고 나가는 http 요청과 헤더 필드를 모니터링할 수 있는 wsgi 미들웨어를 검색하고 있습니다.

Firefox 라이브 헤더와 비슷하지만 서버 측용입니다.

도움이 되었습니까?

해결책

미들웨어

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

시험

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

또한 참조하십시오 werkzeug 디버거 Armin은 대화형 디버깅에 유용하다고 썼습니다.

다른 팁

헤더만 필요한 한 직접 작성하는 것은 그리 어렵지 않습니다.시도해 보세요:

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

Apache 스타일 로그를 원하면 다음을 시도하십시오. 붙여넣기.translogger

그러나 매우 편리하거나 안정적인 위치는 아니지만(소스에 복사할 수도 있음) 더 완전한 것을 위해서는 wsgifilter.proxyapp.DebugHeaders

그리고 다음을 사용하여 하나를 작성합니다. 웹옵:

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)

mod_wsgi 문서는 mod_wsgi뿐만 아니라 모든 WSGI 호스팅 메커니즘에 적용할 수 있는 다양한 디버깅 팁을 제공합니다.보다:

http://code.google.com/p/modwsgi/wiki/디버깅기술

여기에는 요청과 응답을 캡처하는 WSGI 미들웨어 예제가 포함되어 있습니다.

내 WebCore 프로젝트에는 들어오는 요청에 대한 전체 WSGI 환경(따라서 비커 세션, 헤더 등), 아웃바운드 응답에 대한 헤더 및 성능 정보를 MongoDB 데이터베이스에 기록하는 약간의 미들웨어가 있습니다.평균 오버헤드는 약 4ms입니다.

모듈이 핵심 패키지에서 제거되었지만 아직 자체 패키지에 통합되지 않았습니다.이 답변의 현재 버전은 Git 기록에서 확인할 수 있습니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top