تصحيح/مراقبة البرامج الوسيطة لتطبيقات python wsgi
-
02-07-2019 - |
سؤال
أنا أبحث في برنامج وسيط 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: