2008-09-22 79 views

回答

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

见的werkzeug debugger阿明写的,它是交互式调试有用。

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 
+0

OK,这就是传入的一面,但我喜欢的传出响应这样做了。 – 2008-09-22 22:44:01

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

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

该模块已从核心软件包中删除,但尚未集成到其自身中。当前版本为这个答案在Git的历史可:

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

+0

+1用于使用mongodb。性能不是真正的问题,因为我只需要它来进行服务器端apis的开发/调试。 – 2010-03-05 11:06:02