سؤال

لدي WSGI Middleware يحتاج إلى التقاط حالة HTTP (على سبيل المثال 200 OK) أن الطبقات الداخلية من البرامج الوسيطة تعود عن طريق الاتصال start_response. حاليًا أقوم بما يلي ، لكن إساءة استخدام قائمة لا يبدو أن الحل "الصحيح" بالنسبة لي:

class TransactionalMiddlewareInterface(object):
    def __init__(self, application, **config):
        self.application = application
        self.config = config

    def __call__(self, environ, start_response):
        status = []

        def local_start(stat_str, headers=[]):
            status.append(int(stat_str.split(' ')[0]))
            return start_response(stat_str, headers)

        try:
            result = self.application(environ, local_start)

        finally:
            status = status[0] if status else 0

            if status > 199 and status 

سبب إساءة استخدام القائمة هو أنه لا يمكنني تعيين قيمة جديدة إلى مساحة الاسم الأصل من داخل وظيفة محتوية بالكامل.

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

المحلول

يمكنك تعيين الحالة كحقل حقن local_start تعمل نفسها بدلاً من استخدامها status قائمة. لقد استخدمت شيئًا مشابهًا ، يعمل بشكل جيد:

class TransactionalMiddlewareInterface(object):
    def __init__(self, application, **config):
        self.application = application
        self.config = config

    def __call__(self, environ, start_response):
        def local_start(stat_str, headers=[]):
            local_start.status = int(stat_str.split(' ')[0])
            return start_response(stat_str, headers)
        try:
            result = self.application(environ, local_start)
        finally:
            if local_start.status and local_start.status > 199:
                pass
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top