关于简单python wsgi服务器(wsgiref.simple_服务器)的混淆

关于简单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]

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

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框架要求所有应用程序函数都使用两个参数,因此它总是使用两个参数调用函数,因此您必须使用两个参数定义自己的函数,否则它将无法正常工作。

    谢谢。这很有帮助,但仍然不能解释一切。请参见原始帖子中的我的
    编辑