gpt4 book ai didi

python - 关于一个简单的 python wsgi 服务器(wsgiref.simple_server)的困惑

转载 作者:太空狗 更新时间:2023-10-30 01:23:37 24 4
gpt4 key购买 nike

这是一个简单的 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()

查看这段代码时出现了几个问题:

  1. 如何make_server函数仅使用函数名称 application ?我看不出这是如何做的,然后返回 "<function application at 0x7f71686286e0>"字符串(函数对象的 application.__repr__() method)。

  2. 为什么应用函数定义定义environ当它没有在这个函数中使用并且甚至没有在 application 中设置时作为参数稍后调用函数?

  3. 据我了解start_response函数定义中的参数在这里用作一种标识符,这将是函数的名称,该函数设置稍后在 make_server 中需要的其他属性。函数调用。标准库中在哪里定义了该功能? (查了相关模块的源码,但不明白具体是在哪里做的)

观察:改变论点 environ在函数定义中不会改变代码的行为,start_response但是参数必须与 start_response 同名在 application 的正文中功能。

我知道os.environ是一本字典,但我找不到它在 python 标准库中的调用位置。如果environ argument 是必要的并且是唯一可行的第一个参数,我不明白为什么他们每次都要求您明确命名第一个参数( environ ),它给您一种错觉,即使用不同的参数会影响其行为。我知道“显式好于隐式”-python 策略,但在这里我认为它无用且令人困惑。

编辑

由于 Ned 的回答,我现在通过查看源代码了解到 make_server('0.0.0.0', 8080, application)创建 WSGIServer 的实例例如wsgiref.simple_server.WSGIServer((host, port), handler_class)) .深入观察发现初始化方法继承自BaseServer . BaseServer 实例有 server_addressRequestHandlerClass作为实例变量等等。函数对象 application存储在 applicationWSGIServer 的类变量.

但我还是找不到这个 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_server,稍后将能够调用它。这就是您的应用程序的调用方式。传递到您的 application 函数的值之一是另一个函数,称为 start_response。这是一个由 WSGI 作者编写的函数,他们将其提供给您调用,您可以使用以下行

start_response('200 OK', [('Content-Type', 'text/plain')])

您的 application 函数必须采用两个参数,通常称为 environ 和 start_response。您不使用 environ 值,但更复杂的 WSGI 应用程序会。 WSGI 框架期望所有应用程序函数都采用两个参数,因此它总是使用两个参数调用函数,因此您必须使用两个参数定义您的函数,否则它将无法正常工作。

关于python - 关于一个简单的 python wsgi 服务器(wsgiref.simple_server)的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11471211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com