关于简单python wsgi服务器(wsgiref.simple_服务器)的混淆
这是一个简单的PythonWSGi服务器,它打印出关于简单python wsgi服务器(wsgiref.simple_服务器)的混淆,python,network-programming,shared-libraries,wsgi,Python,Network Programming,Shared Libraries,Wsgi,这是一个简单的PythonWSGi服务器,它打印出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]
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()
查看此代码时会出现几个问题:
如何使_服务器
函数仅与函数名应用程序
一起工作?
我看不出这还有什么其他作用,然后返回“”
字符串(函数对象的应用程序。\uuu repr\uuu()方法)
为什么应用程序函数定义将environ
定义为一个参数,而它没有在这个函数中使用,甚至没有在以后的应用程序
函数调用中设置
据我所知,函数定义中的start\u response
参数在这里被用作一种标识符,它将是函数的名称,该函数设置了以后在make\u server
函数调用中需要的其他属性。该功能在标准库中的何处定义?(我已经检查了相关模块的来源,但我不知道具体是在哪里完成的)
观察:在函数定义中更改参数environ
不会改变代码的任何行为,但是start\u response
参数必须与应用程序
函数体中的start\u response
具有相同的名称
我知道os.environ
是一本字典,但在python标准库中找不到它的调用位置。如果environ
参数是必需的,并且是唯一可行的第一个参数,我不明白为什么每次都要求您显式命名第一个参数(environ
),这会让您产生一种错觉,即使用不同的参数会影响其行为。我知道“显式比隐式更好”的python策略,但在这里我认为它是无用的和令人困惑的
编辑
由于Ned的回答,我现在通过查看make_server('0.0.0.0',8080,application)
创建WSGIServer
的实例的源代码来理解,例如wsgiref.simple_server.WSGIServer((主机,端口),处理程序类))
。深入查看,我发现初始化方法继承自BaseServer
。BaseServer实例将server\u address
和RequestHandlerClass
作为实例变量。
函数对象application
存储在WSGIServer
的application
类变量中
但是我仍然找不到python源代码中的其他地方使用了这个应用程序类变量。(我已经搜索了所有包含WSGIServer
父类的类定义的模块)有人知道它在哪里使用吗?这一发现可能会回答我所有的问题。这里重要的Python概念是,函数与其他任何东西一样都是对象,可以分配给变量:
>>> def double(x):
... return 2*x
...
>>> my_fn = double
>>> my_fn(4)
8
当你使用一个没有参数的函数名时,你只是在谈论这个函数,而不是调用它
在这方面:
server = make_server('0.0.0.0', 8080, application)
application
是一个函数,您将它作为值传递给make\u server
,后者稍后将能够调用它。这就是应用程序的调用方式。传递到应用程序
函数中的一个值是另一个函数,称为start\u response
。这是一个由WSGI作者编写的函数,他们将它交给您调用,您可以使用这行代码来调用它
start_response('200 OK', [('Content-Type', 'text/plain')])
应用程序
函数必须接受两个参数,通常称为environ和start\u response。您不使用environ值,但更复杂的WSGI应用程序会使用。WSGI框架要求所有应用程序函数都使用两个参数,因此它总是使用两个参数调用函数,因此您必须使用两个参数定义自己的函数,否则它将无法正常工作。谢谢。这很有帮助,但仍然不能解释一切。请参见原始帖子中的我的编辑。