WSGI:start_response函数的目的是什么

Bor*_*kov 14 python web-services middleware wsgi web-applications

你能提供一个WSGI start_response功能的真实例子吗?(Web服务器为wsgi应用程序提供该功能)

我无法理解引入的目的start_response.

(我喜欢阅读有关WSGI标准的10个相同的文本.他们都说"WSGI标准是......"他们没有说"WSGI设计这样才能 ......" :()

Aya*_*Aya 11

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

好吧,start_response()函数for mod_wsgi2678行定义mod_wgsi.c

他们都没有说"WSGI就是这样设计的......"

对于WSGI设计的这一方面似乎没有多少理由PEP3333.浏览web-sig邮件列表档案,我发现了这条消息 ......

前段时间我反对决定从下一个版本的WSGI中删除start_response函数,理由是没有start_callable,异步扩展是不可能支持的.

现在我发现删除start_response也将无法支持协同程序(或者至少使用一些协同程序).

[...]

...开始了一个关于这部分实施的理由的长篇大论,这可能值得一读.

如果你真的想知道WSGI接口的这方面的来历,你必须阅读大量的信息的初始草案在2003年12月,和稍后草案于2004年8月.


更新

如何与其他协议兼容?

我不太清楚你的意思.忽略所有早期草案,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
Run Code Online (Sandbox Code Playgroud)

......而'推荐'的方法是......

def application(environ, start_response):
    start_response(status, headers)
    return ['content block 1',
            'content block 2',
            'content block 3']
Run Code Online (Sandbox Code Playgroud)

据推测,你可以使用两者,...

def application(environ, start_response):
    write = start_response(status, headers)
    write('content block 1')
    return ['content block 2',
            'content block 3']
Run Code Online (Sandbox Code Playgroud)

...但结果行为可能未定义.

根据这篇博文的看法,正在考虑的新WSGI 2.x方法是......

def application(environ):
    return (status,
            headers,
            ['content block 1',
             'content block 2',
             'content block 3'])
Run Code Online (Sandbox Code Playgroud)

...它消除了start_response()可调用的,显然是write()可调用的,但是没有迹象表明何时(或者甚至是)这可能取代WSGI 1.x.

  • 请不要让异步支持者在start_response()的范围内混淆水域.其中一个主要原因是允许服务器返回write()可调用以支持现有的Python Web应用程序,这些应用程序曾用于调用write()函数来生成内容.这使他们不会被重写以返回可迭代. (5认同)