代码之家  ›  专栏  ›  技术社区  ›  Srikanth

python wsgi应用程序的调试/监视中间件

  •  0
  • Srikanth  · 技术社区  · 18 年前

    类似于firefox live Header,但用于服务器端。

    5 回复  |  直到 18 年前
        1
  •  2
  •   Armin Ronacher    18 年前

    只要您只需要标题,就不难自己编写。试试看:

    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
    
        2
  •  2
  •   Florian Bösch    18 年前

    中间件

    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 debugger Armin写道,它对于交互式调试非常有用。

        3
  •  2
  •   ianb    17 年前

    如果您想要Apache风格的日志,请尝试 paste.translogger

    但是对于更完整的东西,虽然不是在一个非常方便或稳定的位置(可能复制到您的源代码)是 wsgifilter.proxyapp.DebugHeaders

    并使用 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)
    
        4
  •  1
  •   Graham Dumpleton    17 年前

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

    这包括一个捕获请求和响应的示例WSGI中间件。

        5
  •  1
  •   amcgregor    16 年前

    该模块已从核心包中移除,但尚未集成到自己的模块中。Git历史记录中提供了此答案的当前版本:

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