我最近一直在尝试学习 WSGI 以及 Web 与 Python 相关的工作方式。所以我一直在阅读 Werkzeug 和 PEP333 来学习。
但是,我遇到了一个小问题,我想我理解但可能不理解,所以我希望您能朝着正确的方向前进。
PEP333 指出:
应用程序对象只是一个接受两个参数的可调用对象。不应将术语“对象”误解为需要一个实际的对象实例:函数、方法、类或具有调用方法的实例都可以用作应用程序对象。应用程序对象必须能够被多次调用,因为几乎所有服务器/网关(CGI 除外)都会发出这样的重复请求。
实施:
class AppClass:
"""Produce the same output, but using a class
(Note: 'AppClass' is the "application" here, so calling it
returns an instance of 'AppClass', which is then the iterable
return value of the "application callable" as required by
the spec.
If we wanted to use *instances* of 'AppClass' as application
objects instead, we would have to implement a '__call__'
method, which would be invoked to execute the application,
and we would need to create an instance for use by the
server or gateway.
"""
def __init__(self, environ, start_response):
self.environ = environ
self.start = start_response
def __iter__(self):
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
self.start(status, response_headers)
yield "Hello world!\n"
我的问题只是为了澄清我是否理解正确。
它声明 AppClass 是应用程序,当我们调用它时,它返回一个 AppClass 的实例。但是再往下说“如果我们想使用AppClass ass 应用程序对象的实例来代替”,这是否是说当 WSGI 的服务器端调用 AppClass 对象时,只有一个实例在运行?
例如。服务器可以向应用程序发出多个请求(200 OK)以获得更多响应,因此将iter放入类中。但是每个请求都通过同一个单一的 AppClass 实例运行,对服务器的每个请求基本上不会实例化多个 AppClass 实例?
对不起,如果这是冗长的,如果我没有多大意义,再次道歉。我正在努力改进atm。
一如既往地感谢您的投入。
谢谢。