拦截WSGI start_response的适当方法是什么?

amc*_*gor 5 python correctness middleware wsgi

我有WSGI中间件,它需要捕获200 OK中间件内部层通过调用返回的HTTP状态(例如)start_response。目前,我正在执行以下操作,但是滥用列表似乎并不是我的“正确”解决方案:

TransactionalMiddlewareInterface类(对象):
    def __init __(self,application,** config):
        self.application =应用程序
        self.config =配置

    def __call __(自我,环境,start_response):
        状态= []

        def local_start(stat_str,headers = []):
            status.append(int(stat_str.split('')[0]))
            返回start_response(stat_str,标头)

        尝试:
            结果= self.application(环境,local_start)

        最后:
            状态=状态[0],如果状态否则为0

            如果状态> 199并且状态 

列表滥用的原因是我无法从完全包含的函数中为父名称空间分配新值。

nkr*_*rkv 5

您可以将状态分配为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
Run Code Online (Sandbox Code Playgroud)