下面的代码运行一个简单的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()
答案 0 :(得分:0)
我希望这是您的浏览器在主要浏览器旁边发出另一个请求,这也是您的WSGI应用程序捕获的 - 可能是针对favicon.ico。记录self.environ['PATH_INFO']
以查看确切的请求。