【发布时间】:2012-07-13 08:19:44
【问题描述】:
这是一个简单的 python wsgi 服务器,在 0.0.0.0:8080 上打印出 Hello guys!!!。
from wsgiref.simple_server import make_server
content = 'Hello guys!!!'
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return [content]
server = make_server('0.0.0.0', 8080, application)
server.serve_forever()
查看此代码时会出现几个问题:
make_server函数如何仅与函数名称application一起工作? 我看不出这有什么其他作用,然后返回"<function application at 0x7f71686286e0>"字符串(函数对象的application.__repr__() method)。为什么应用程序函数定义将
environ定义为一个参数,而它没有在这个函数中使用,甚至没有在以后的application函数调用中设置?据我了解,函数定义中的
start_response参数在这里用作一种标识符,这将是设置稍后在make_server函数调用中需要的其他属性的函数的名称。标准库中定义的功能在哪里? (我已经检查了相关模块的来源,但我不明白它是在哪里完成的)
观察:更改函数定义中的参数 environ 不会改变代码行为中的任何内容,但是 start_response 参数必须与 application 正文中的 start_response 具有相同的名称功能。
我知道os.environ 是一本字典,但我在 python 标准库中找不到它的调用位置。如果environ 参数是必要的并且是唯一可行的第一个参数,我不明白为什么他们会要求您每次都明确命名第一个参数(environ),它会给您一种错觉,即使用不同的参数会影响它的行为。我知道“显式优于隐式”-python 策略,但在这里我认为它是无用且令人困惑的。
编辑
由于 Ned 的回答,我现在通过查看 make_server('0.0.0.0', 8080, application) 创建 WSGIServer 的实例(例如 wsgiref.simple_server.WSGIServer((host, port), handler_class)))的源代码了解到。更深入地看,我发现初始化方法是从 BaseServer 继承的。 BaseServer 实例具有 server_address 和 RequestHandlerClass 作为实例变量等。
函数对象application 存储在WSGIServer 的application 类变量中。
但我仍然找不到这个 application 类变量在 python 源代码中的某个地方使用的其他地方。 (我已经搜索了包含WSGIServer 父类的类定义的所有模块)有人知道它在哪里使用吗?找到这可能会回答我所有的问题。
【问题讨论】:
标签: python network-programming shared-libraries wsgi