Промежуточное ПО Debug / Monitor для приложений Python wsgi

1

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

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

Теги:
debugging
wsgi
middleware

5 ответов

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

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)
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
    Хорошо, это входящая сторона, но мне нравится делать то же самое и для исходящего ответа.
1

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

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

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

  • 0
    +1 за использование mongodb. Производительность на самом деле не имеет значения, потому что она мне нужна только для разработки / отладки apis на стороне сервера.
  • 0
    В качестве краткого замечания, данные с веб-сайта WebCore (который использует мое промежуточное программное обеспечение для мониторинга производительности) доступны для общественности: web-core.org/stats и являются лишь одним из способов визуализации данных.
1

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

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

Это включает пример связующего ПО WSGI, который захватывает запрос и ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню