非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
对象在哪里?
有没有人有这方面的想法?
答案 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示例更简单,更容易。