您能否提供WSGI start_response
功能的真实示例? (Web服务器为wsgi应用程序提供该功能)
我无法理解引入start_response
的目的。
(我读过10个关于WSGI标准的相同文本。他们都说“WSGI标准是......”他们都没有说“WSGI的设计方式是为了 .. 。:()
答案 0 :(得分:11)
定义了line 2678 of你能提供一个WSGI
start_response()
函数的真实例子吗?
mod_wgsi.c
的start_response()
函数
他们都没有说“WSGI是按照这种方式设计的......”
在PEP3333
中,WSGI设计的这一方面似乎没有多少理由。浏览web-sig mailing list archives,我遇到了this message ...
前段时间我反对删除start_response的决定 来自下一版本WSGI的功能,使用的理由是 没有start_callable,异步扩展是不可能的 支持。
现在我发现删除start_response也会 不可能支持协程(或者至少是一些协同程序 使用)。
[...]
...开始了一个关于这部分实现的理由的长篇大论,这可能值得一读。
如果您真的想知道WSGI界面这方面的起源,那么您必须阅读2003年12月this initial draft和2004年8月this later draft之间的大量消息。
<强>更新强>
如何与其他协议兼容?
我不太清楚你的意思。忽略所有早期草案,WSGI 1.x界面可以以两种不同的方式使用。
'弃用'方法是......
def application(environ, start_response):
write = start_response(status, headers)
write('content block 1')
write('content block 2')
write('content block 3')
return None
...而'推荐'方法是......
def application(environ, start_response):
start_response(status, headers)
return ['content block 1',
'content block 2',
'content block 3']
据推测,你可以同时使用两者......
def application(environ, start_response):
write = start_response(status, headers)
write('content block 1')
return ['content block 2',
'content block 3']
...但结果行为可能未定义。
通过this blog post的外观,正在考虑的新WSGI 2.x方法是......
def application(environ):
return (status,
headers,
['content block 1',
'content block 2',
'content block 3'])
...它消除了start_response()
可调用,显然,write()
可调用,但没有迹象表明何时(或者甚至是)这可能取代WSGI 1.x.
答案 1 :(得分:3)
我发现一个旧线程可以解释原因。
为什么会有start_response然后单独返回?
一个原因是它允许您将应用程序编写为生成器。但更重要的是,为了支持&#39;写()&#39;为了与现有框架向后兼容,这几乎是&#34;杀手锏的原因&#34;它的结构如何。这个特别的创新是Tony Lownds&#39;然而,心灵不是我的。在我最初的WSGI概念中,应用程序收到了一个输出流,只是编写了标题和所有内容。
答案 2 :(得分:1)
TLDR:
这只是为了向后兼容一些现有框架。 WSGI 建议使用新框架以避免使用它。
略长的版本:
官方 Python WSGI Standards Page 的这一部分提到:
<块引用>可调用的 write() 由可调用的 start_response() 返回。
...
<块引用>一些现有的应用程序框架 API 支持无缓冲输出 与 WSGI 不同的方式。具体来说,他们提供了一个“写” 写入无缓冲数据块的某种函数或方法, 否则他们提供缓冲的“写入”功能和“刷新” 刷新缓冲区的机制。
遗憾的是,此类 API 无法按照 WSGI 的标准实现 “可迭代”应用程序返回值,除非线程或其他特殊 使用机制。
因此,要允许这些框架继续使用命令式 API,WSGI 包括一个特殊的 write() 可调用,由 start_response 可调用。
新的 WSGI 应用程序和框架不应使用 write() 如果可以避免这样做,则可调用。可调用的 write() 是 严格来说是一种支持命令式流媒体 API 的黑客
整篇文章完美地回答了编写服务器和框架的 WSGI 标准,对任何开始使用 Python 进行后端 Web 开发的初学者都有帮助。