混淆一个简单的python wsgi服务器(wsgiref.simple_server)

时间:2012-07-13 13:11:54

标签: python network-programming shared-libraries wsgi

这是一个简单的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参数在这里用作一种标识符,它将是稍后在{{1}中设置其他属性的函数的名称。函数调用。标准库中定义的功能在哪里? (我已经检查了相关模块的来源,但我不明白它到底在哪里完成)

  4. 观察:更改函数定义中的参数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_addressRequestHandlerClass作为实例变量等。 函数对象application存储在application的{​​{1}}类变量中。

    但我还是找不到在python源代码中使用这个WSGIServer类变量的地方。 (我搜索了包含application父类的类定义的所有模块。有人知道它在哪里使用吗?发现这可能会回答我的所有问题。

1 个答案:

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