这是一个简单的python服务器,它在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参数必须与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父类的类定义的模块)有人知道它在哪里使用吗?找到可能回答我所有问题的模块。
发布于 2012-07-13 13:20:48
这里重要的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_server,后者稍后将能够调用它。您的应用程序就是这样被调用的。传递给application函数的一个值是另一个函数,称为start_response。这是一个由WSGI作者编写的函数,他们给您调用它,这是您使用行进行的
start_response('200 OK', [('Content-Type', 'text/plain')])您的application函数必须使用两个参数,通常称为environ和start_response。您不使用environ值,但是更复杂的WSGI应用程序会使用。WSGI框架要求所有应用程序函数都使用两个参数,因此它总是用两个参数调用函数,所以您必须用两个参数来定义您的函数,否则它就不能正常工作。
https://stackoverflow.com/questions/11471211
复制相似问题