这是一个简单的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
参数在这里用作一种标识符,它将是稍后在{{1}中设置其他属性的函数的名称。函数调用。标准库中定义的功能在哪里? (我已经检查了相关模块的来源,但我不明白它到底在哪里完成)
观察:更改函数定义中的参数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
的{{1}}类变量中。
但我还是找不到在python源代码中使用这个WSGIServer
类变量的地方。 (我搜索了包含application
父类的类定义的所有模块。有人知道它在哪里使用吗?发现这可能会回答我的所有问题。
答案 0 :(得分:3)
这里重要的Python概念是函数就像其他任何东西一样,可以分配给变量:
>>> def double(x):
... return 2*x
...
>>> my_fn = double
>>> my_fn(4)
8
当您使用没有parens的函数名称时,您只是在谈论该函数,而不是调用它。
在这一行:
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框架要求所有应用程序函数都带有两个参数,因此它总是使用两个参数调用该函数,因此您必须使用两个参数定义您的参数,否则它将无法正常工作。