0

我正在搜索一个 wsgi 中间件,我可以围绕一个 wsgi 应用程序进行扭曲,它可以让我监控传入和传出的 http 请求和标头字段。

类似于 Firefox 实时标头之类的东西,但用于服务器端。

4

5 回答 5

2

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

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
于 2008-09-22T22:35:22.123 回答
2

中间件

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

另请参阅 Armin 编写的werkzeug 调试器,它对交互式调试很有用。

于 2008-09-22T23:05:34.310 回答
2

如果你想要 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)
于 2008-11-21T01:35:12.437 回答
1

mod_wsgi 文档提供了各种调试技巧,它们适用于任何 WSGI 托管机制,而不仅仅是 mod_wsgi。看:

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

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

于 2009-06-25T01:53:10.850 回答
1

我的 WebCore 项目有一些中间件,用于记录传入请求的整个 WSGI 环境(例如 Beaker 会话、标头等)、出站响应的标头以及 MongoDB 数据库的性能信息。平均开销约为 4 毫秒。

该模块已从核心包中删除,但尚未集成到它自己的包中。该答案的当前版本可在 Git 历史记录中找到:

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

于 2010-03-05T06:23:26.807 回答