سؤال

أنا أبحث في برنامج وسيط wsgi يمكنني الالتفاف حول تطبيقات wsgi والذي يتيح لي مراقبة طلبات http الواردة والصادرة وحقول الرأس.

شيء مثل الرؤوس المباشرة لمتصفح فايرفوكس، ولكن من جانب الخادم.

هل كانت مفيدة؟

المحلول

الوسيطة

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

أنظر أيضاً مصحح الأخطاء كتب أرمين أنه مفيد لتصحيح الأخطاء التفاعلي.

نصائح أخرى

لا ينبغي أن يكون من الصعب جدًا أن تكتب بنفسك طالما أنك تحتاج فقط إلى الرؤوس.جرب ذلك:

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

إذا كنت تريد سجلات بنمط Apache، فجرّب لصق.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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top