首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单python服务器(wsgiref.simple_server)的混淆

简单python服务器(wsgiref.simple_server)的混淆
EN

Stack Overflow用户
提问于 2012-07-13 13:11:53
回答 1查看 1.9K关注 0票数 5

这是一个简单的python服务器,它在Hello guys!!!上打印0.0.0.0:8080

代码语言:javascript
复制
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参数必须与start_response具有相同的名称。

我知道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存储在WSGIServerapplication类变量中。

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

EN

回答 1

Stack Overflow用户

发布于 2012-07-13 13:20:48

这里重要的Python概念是,函数和其他任何东西一样是对象,可以分配给变量:

代码语言:javascript
复制
>>> def double(x):
...     return 2*x
...

>>> my_fn = double
>>> my_fn(4)
8

当您使用一个没有父函数的函数的名称时,您只是在谈论这个函数,而不是调用它。

在这一行:

代码语言:javascript
复制
server = make_server('0.0.0.0', 8080, application)

application是一个函数,您将它作为一个值传递给make_server,后者稍后将能够调用它。您的应用程序就是这样被调用的。传递给application函数的一个值是另一个函数,称为start_response。这是一个由WSGI作者编写的函数,他们给您调用它,这是您使用行进行的

代码语言:javascript
复制
start_response('200 OK', [('Content-Type', 'text/plain')])

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11471211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档