我认为
Florian's answer回答了你关于"什么是WSGI"的问题,特别是如果你阅读了
the PEP。
至于你在最后提出的问题:
WSGI、CGI、FastCGI等都是用于Web服务器运行代码并传递生成的动态内容的协议。与静态Web服务相比,其中纯HTML文件基本上按原样传递给客户端。
CGI、FastCGI和SCGI都是与语言无关的。您可以使用Perl、Python、C、bash或其他语言编写CGI脚本。CGI定义了将调用哪个可执行文件,基于URL以及如何调用它:参数和环境。它还定义了在您的可执行文件完成后应该如何将返回值传回Web服务器。这些变化基本上是为了能够处理更多请求、减少延迟等优化;基本概念是相同的。
WSGI仅适用于Python。它定义了标准函数签名,而不是与语言无关的协议:
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']
那是一个完整的(虽然有限)WSGI应用程序。具有WSGI支持的Web服务器(例如使用mod_wsgi的Apache)可以在每个请求到达时调用此函数。
这样做的原因是我们可以避免将HTTP GET / POST转换为CGI再转换回Python,然后再返回,从而避免混乱的步骤。它是一种更直接、更清洁和更高效的链接方式。
如果所有需要为请求执行的操作都是函数调用,则可以更轻松地在Web服务器后面运行长时间运行的框架。对于普通的CGI,您需要为每个单独的请求
启动整个框架。
要拥有WSGI支持,您需要安装WSGI模块(如
mod_wsgi),或者使用内置WSGI的Web服务器(如
CherryPy)。如果两者都不可能,您可以使用PEP中提供的CGI-WSGI桥接器。