这是一个简单的 python wsgi 服务器,可以Hello guys!!!
在0.0.0.0:8080
.
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
名称相同。start_response
application
我知道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
存储在 的application
类变量中WSGIServer
。
但我仍然找不到这个application
类变量在 python 源代码中的其他地方使用。(我已经搜索了所有包含父类的类定义的模块WSGIServer
)有人知道它在哪里使用吗?发现这可能会回答我所有的问题。