<p>我认为<a href="https://stackoverflow.com/questions/219110/how-python-web-frameworks-wsgi-and-cgi-fit-together/219124#219124">Florian's answer</a>回答了您关于“什么是WSGI”的部分问题,特别是当您阅读<a href="http://www.python.org/dev/peps/pep-0333" rel="nofollow noreferrer">the PEP</a>时。</p>
<p>至于你最后提出的问题:</p>
<p>WSGI、CGI、FastCGI等都是web服务器运行代码并交付生成的动态内容的协议。将其与静态web服务进行比较,静态web服务中的纯HTML文件基本上是按原样交付给客户机的。</p>
<p><strong>CGI、FastCGI和SCGI是语言无关的。</strong>您可以用Perl、Python、C、bash等语言编写CGI脚本。CGI定义了<em>将基于URL调用哪个</em>可执行文件,以及<em>如何调用</em>可执行文件:参数和环境。它还定义了可执行文件完成后返回值应如何传递回web服务器。这些变化基本上是为了能够处理更多的请求、减少延迟等等而进行的优化;基本概念是相同的。</p>
<p><strong>WSGI仅限于Python。</strong>定义的标准函数签名不是与语言无关的协议:</p>
<pre><code>def simple_app(environ, start_response):
"""Simplest possible application object"""
status = '200 OK'
response_headers = [('Content-type','text/plain')]
start_response(status, response_headers)
return ['Hello world!\n']
</code></pre>
<p>这是一个完整的(如果有限制的话)WSGI应用程序。支持WSGI的web服务器(例如带有mod_WSGI的Apache)可以在请求到达时调用此函数。</p>
<p>这非常好的原因是,我们可以避免从HTTP GET/POST转换为CGI再转换为Python的混乱步骤,然后在退出时再次转换。这是一个更直接,更干净,更有效的联系。</p>
<p>如果一个请求所需要做的只是一个函数调用,那么在web服务器后面运行长时间运行的框架也会容易得多。对于普通的CGI,每个单独的请求都必须<a href="http://tools.cherrypy.org/wiki/RunAsCGI" rel="nofollow noreferrer">start your whole framework up</a>。</p>
<p>要获得WSGI支持,您需要安装一个WSGI模块(比如<a href="http://code.google.com/p/modwsgi/" rel="nofollow noreferrer">mod_wsgi</a>),或者使用包含WSGI的web服务器(比如<a href="http://tools.cherrypy.org/" rel="nofollow noreferrer">CherryPy</a>)。如果这两种方法都不可行,您可以使用PEP中给出的CGI-WSGI桥。</p>