奇怪的Python WSGI行为导致双重迭代

时间:2014-07-10 17:20:43

标签: python wsgi

下面的代码运行一个简单的WSGI应用程序,它会增加本地计数器和全局计数器。此测试的目的是确保为每个HTTP请求创建新的app对象,因此预期的行为是全局计数器递增每个请求,而本地计数器应始终为'1',因为它只增加一次对于app类的每个实例化。

实际结果?几乎是我的预期,但令人惊讶的是,在第一个HTTP请求之后,全局计数器的每个HTTP请求增加了TWICE。 (序列类似于[1,3,5,7,9,...]。)我知道 iter ()方法仅在每个应用程序对象实例化时被调用一次,因为本地变量总是'1'。那是怎么回事?

这可能无关紧要,因为我真正关心的是确保WSGI容器始终为每个请求创建一个新对象并仅使用它一次,但这真的很奇怪。我想知道为什么。

我不喜欢无法解释的副作用。有人能给我一些见解吗?

gctr = 0

class app(object):
    html = '''<html><head><title>Simple WSGI App Class Test</title></head>
    <body><h2>Simple WSGI App Class Test</h2>
    <p>module counter = {}</p>
    <p>global counter = {}</p>
    </body></html>'''
    ctr = 0

    def __init__(self, environ, start_response):
        self.environ = environ
        self.start = start_response

    def __iter__(self):
        self.start('200 OK', [('Content-Type', 'text/html')])
        global gctr
        gctr += 1
        self.ctr += 1
        yield self.html.format(self.ctr, gctr)

if __name__ == '__main__':

    # Using simple_server
    from wsgiref.simple_server import make_server
    srv = make_server('localhost', 8080, app)
    srv.serve_forever()

1 个答案:

答案 0 :(得分:0)

我希望这是您的浏览器在主要浏览器旁边发出另一个请求,这也是您的WSGI应用程序捕获的 - 可能是针对favicon.ico。记录self.environ['PATH_INFO']以查看确切的请求。