WSGI:start_response函数的目的是什么

时间:2013-05-27 14:05:24

标签: python web-services web-applications wsgi middleware

您能否提供WSGI start_response功能的真实示例? (Web服务器为wsgi应用程序提供该功能)

我无法理解引入start_response目的

(我读过10个关于WSGI标准的相同文本。他们都说“WSGI标准是......”他们都没有说“WSGI的设计方式是为了 .. 。:()

3 个答案:

答案 0 :(得分:11)

  

你能提供一个WSGI start_response()函数的真实例子吗?

mod_wsgi

定义了line 2678 of mod_wgsi.cstart_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 开发的初学者都有帮助。