为什么WSGI必须使用start_response并返回迭代器?

时间:2014-07-10 03:01:20

标签: python django web cgi wsgi

非WSGI方式:

def my_view(request):
    request.start_response('200 OK')
    request.send_header('Content-Type', 'text/plain')
    request.end_headers()
    request.write('Hello World!')
    request.write('Goodbye World!')
    request.end()

WSGI方式:

def my_view(environ, start_response):
    def generate():
        yield 'Hello World!'
        yield 'Goodbye World!'
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return generate()

代码来自this blog,但我不太明白..

从上面可以看出,非WSGI看起来更容易。 WSGI看起来很混乱..为什么start_reponse必须传递my_view?为什么my_view必须返回迭代器? WSGI中的request对象在哪里?

有没有人有这方面的想法?

1 个答案:

答案 0 :(得分:3)

简单的答案是:必须这样,因为WSGI以这种方式指定它。 ; - )

start_response()在两个示例中都被传递,在第一个示例中,它与request对象“捆绑”,WSGI将环境变量与callable分开以启动响应。 / p>

返回一个iterable可以更容易地以懒惰的方式生成响应并链接多个中间件,而无需一次性将整个内容从一个中间件移交给下一个中间件。顺便说一下,生成器函数不是最简单的解决方案,因为返回值只需要是可迭代的,而不是迭代器本身甚至是生成器。所以这将是WSGI应用程序的最小例子:

def app(environ, start_response):
    start_response('200 OK', [('Content-type', 'text/plain')])
    return ['Hello world!\n']

我认为这看起来比非WSGI示例更简单,更容易。