2008-09-22 19 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