python wsgi应用程序的调试/监视中间件
时间:2020-03-06 14:34:08 来源:igfitidea点击:
我正在搜索一个wsgi中间件,它可以在wsgi应用程序中弯曲,并且可以监视传入和传出的http请求以及标头字段。
类似于firefox live标题,但用于服务器端。
解决方案
只要只需要标头,编写自己的代码就不会太难。试试看:
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
中间件
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写道,它对于交互式调试很有用。
如果我们需要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)
mod_wsgi文档提供了各种调试技巧,这些技巧适用于任何WSGI托管机制,而不仅仅是mod_wsgi。看:
http://code.google.com/p/modwsgi/wiki/DebuggingTechniques
这包括捕获请求和响应的示例WSGI中间件。
我的WebCore项目有一些中间件,用于记录传入请求的整个WSGI环境(因此,Beaker会话,标头等),出站响应的标头以及性能信息到MongoDB数据库。平均开销约为4毫秒。
该模块已从核心软件包中删除,但尚未集成到其自身中。 Git历史记录中提供了此答案的当前版本:
http://github.com/GothAlice/WebCore/blob/cd1d6dcbd081323869968c51a78eceb1a32007d8/web/extras/cprofile.py