Ben*_*ey4 5 python network-programming wsgi shared-libraries
这是打印出一个简单的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()
Run Code Online (Sandbox Code Playgroud)
查看此代码时会出现几个问题:
该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政策,但在这里我认为它是无用的和令人困惑的.
由于斯内德的回答我现在通过查看源了解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.
但是我仍然找不到在applicationpython源代码中使用此类变量的地方.(我搜索了包含父类的类定义的所有模块WSGIServer)有人知道它在哪里使用吗?发现这可能会回答我的所有问题.
这里重要的 Python 概念是函数和其他任何东西一样都是对象,并且可以分配给变量:
>>> def double(x):
... return 2*x
...
>>> my_fn = double
>>> my_fn(4)
8
Run Code Online (Sandbox Code Playgroud)
当您使用不带括号的函数名称时,您只是在谈论该函数,而不是调用它。
在这一行中:
server = make_server('0.0.0.0', 8080, application)
Run Code Online (Sandbox Code Playgroud)
application是一个函数,您将其作为值传递给make_server,稍后将能够调用它。这就是您的应用程序的调用方式。传递到函数中的值之一application是另一个函数,称为start_response。这是 WSGI 作者编写的函数,他们将其提供给您来调用,您可以使用以下行来调用
start_response('200 OK', [('Content-Type', 'text/plain')])
Run Code Online (Sandbox Code Playgroud)
您的application函数必须采用两个参数,通常称为 environ 和 start_response。您不使用环境值,但更复杂的 WSGI 应用程序会使用。WSGI 框架期望所有应用程序函数都采用两个参数,因此它总是使用两个参数调用该函数,因此您必须使用两个参数定义您的函数,否则它将无法正常工作。
| 归档时间: |
|
| 查看次数: |
1609 次 |
| 最近记录: |