pythonweb框架、WSGI和CGI如何结合在一起

pythonweb框架、WSGI和CGI如何结合在一起,python,apache,cgi,wsgi,Python,Apache,Cgi,Wsgi,我有一个帐户,可以将Python脚本作为CGI运行。我想这是最简单的CGI,因为要运行,我必须在.htaccess中定义以下内容: Options +ExecCGI AddType text/html py AddHandler cgi-script .py 现在,每当我使用Python查看web编程时,我都会听到很多关于WSGI以及大多数框架如何使用它的信息。但我只是不明白这一切是如何结合在一起的,尤其是当我的web服务器被提供(Apache在主机上运行)而不是我真正可以使用的东西时(除了定

我有一个帐户,可以将Python脚本作为CGI运行。我想这是最简单的CGI,因为要运行,我必须在
.htaccess
中定义以下内容:

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py
现在,每当我使用Python查看web编程时,我都会听到很多关于WSGI以及大多数框架如何使用它的信息。但我只是不明白这一切是如何结合在一起的,尤其是当我的web服务器被提供(Apache在主机上运行)而不是我真正可以使用的东西时(除了定义
.htaccess
命令)

CGI和框架是如何连接起来的?如果我想在我的基本CGI配置上运行一个web框架(比如说或),我需要知道、安装和做什么?如何安装WSGI支持?

您可以作为示例。但是,每次有请求时,都会启动一个新的Python解释器,并且需要构建整个上下文(数据库连接等),所有这些都需要时间

如果您想运行WSGI,最好是您的主机安装并进行适当的配置,将控制权推迟到您的应用程序

是为任何可以说话的Web服务器或AJP运行WSGI的另一种方式。根据我的经验,只有FCGI真正起作用,并且它可以通过或通过运行单独的Python守护进程在Apache中使用

是一个非常类似于CGI的协议,CGI定义了一组Web服务器和Python代码如何交互的规则,它被定义为。这使得许多不同的Web服务器可以使用相同的应用程序协议使用许多不同的框架和应用程序。这是非常有益的,而且非常有用。

我想回答了你关于“什么是WSGI”的问题,特别是如果你阅读了

至于你最后提出的问题:

WSGI、CGI、FastCGI等都是web服务器运行代码和交付生成的动态内容的协议。将此与静态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)可以在请求到达时调用此函数

这一点之所以如此重要,是因为我们可以避免从httpget/POST转换为CGI再转换为Python这一繁琐的步骤,然后再返回。这是一种更直接、更干净、更有效的联系方式

如果一个请求只需要一个函数调用,那么在web服务器后面运行长时间运行的框架也会容易得多。使用普通的CGI,您必须为每个单独的请求提供支持


要获得WSGI支持,您需要安装WSGI模块(如),或者使用带有WSGI插件的web服务器(如)。如果两者都不可能,那么可以使用PEP中给出的CGI-WSGI桥。

这是Python的一个简单抽象层,类似于Java的Servlet规范。尽管CGI的级别很低,只是将内容转储到流程环境和标准输入/输出中,但上述两个规范将http请求和响应建模为该语言中的构造。然而,我的印象是,在Python中,人们还没有完全确定事实上的实现,因此您混合了参考实现和其他实用程序类型库,它们提供了WSGI支持(例如,粘贴)的其他功能。当然我可能错了,我是Python的新手。“web脚本”社区从不同的方向(共享主机、CGI遗留问题、特权分离问题)着手解决这个问题,而Java用户却没有这样做(在专用环境中针对静态编译和部署的代码运行单个企业容器)。

WSGI、CGI、,并且所有框架都是连接的?

Apache侦听端口80。它得到一个HTTP请求。它解析请求以找到响应的方法。Apache有很多选择来响应。一种响应方法是使用CGI运行脚本。另一种响应方式是简单地提供一个文件

对于CGI,Apache准备一个环境并通过CGI协议调用脚本。这是一种标准的Unix Fork/Exec情况——CGI子进程继承一个OS环境,包括套接字和标准输出。CGI子流程编写一个响应,返回Apache;Apache将此响应发送到浏览器

CGI既原始又烦人。主要是因为它为每个请求派生一个子流程,子流程必须退出或关闭stdout和stderr以表示响应结束

WSGI是一个基于CGI设计模式的接口。它不一定是CGI——它不必为每个请求派生子进程。它可以是CGI,但不一定是

WSGI以几种重要的方式添加到CGI设计模式中。它为您解析HTTP请求头并将其添加到环境中。它在环境中作为类似文件的对象提供任何面向后期的输入。它还为您提供了一个函数,该函数将对响应进行公式化,从而避免了大量格式化细节

如果我想在基本CGI配置上运行web框架(比如web.py或cherrypy),我需要知道/安装/做什么?

回想一下,分叉子流程是非常昂贵的。有两种方法可以解决这个问题

<
Apache -> mod_fastcgi -> FLUP (via FastCGI protocol) -> Django (via WSGI protocol)