2008-09-22 7 views
1

Я ищу промежуточное программное обеспечение wsgi, которое можно деформировать вокруг приложений wsgi и которое позволяет мне отслеживать входящие и исходящие HTTP-запросы и поля заголовков.Отладка/Мониторинг промежуточного программного обеспечения для приложений python wsgi

Что-то вроде firefox live headers, но для серверной части.

ответ

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 Armin писал, что это полезно для интерактивной отладки.

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

КИ, это входящая сторона, но я хотел бы сделать то же самое для исходящего ответа тоже. – 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

документация mod_wsgi предоставляет различные советы по отладке, которые применимы к любому хостинг механизма WSGI, а не только mod_wsgi. См:

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

Это включает WSGI промежуточного программного примера, который фиксирует запрос и ответ.

1

В моем проекте WebCore имеется некоторое промежуточное программное обеспечение, которое регистрирует всю среду WSGI (таким образом, сеансы Beaker, заголовки и т. Д.) Для входящего запроса, заголовки исходящих ответов, а также информацию о производительности в базе данных MongoDB. Средние накладные расходы составляют около 4 мс.

Модуль был удален из основного пакета, но еще не интегрирован в его собственный. Текущая версия от этого ответа можно найти в истории Git:

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

+0

+1 для использования mongodb. Производительность на самом деле не вызывает беспокойства, потому что мне это нужно только для разработки/отладки серверной части apis. – 2010-03-05 11:06:02

 Смежные вопросы

  • Нет связанных вопросов^_^