Python web框架、WSGI和CGI如何配合

2024-09-29 21:27:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Options +ExecCGI
AddType text/html py
AddHandler cgi-script .py

现在,每当我用Python查找web编程时,我都会听到很多关于WSGI和大多数框架如何使用它的信息。但我只是不明白它们是如何结合在一起的,特别是当我的web服务器被提供(Apache在主机上运行)时,我无法真正使用它(除了定义.htaccess命令)。

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


Tags: textpy脚本框架webwsgi定义html
3条回答

WSGI、CGI和框架是如何连接的?

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

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

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

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

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

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

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

  1. Embeddedmod_wsgimod_python将Python嵌入到Apache中;没有进程分叉。Apache直接运行Django应用程序。

  2. 守护进程mod_wsgimod_fastcgi允许Apache使用WSGI协议与单独的守护进程(或“长时间运行的进程”)交互。启动长时间运行的Django进程,然后配置Apache的mod_fastcgi与该进程通信。

请注意,mod_wsgi可以在两种模式下工作:嵌入式或守护进程。

当您阅读mod_fastcgi时,您将看到Django使用flup根据mod_fastcgi提供的信息创建与WSGI兼容的接口。管道是这样工作的。

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

Django有几个“Django.core.handlers”用于各种接口。

对于mod_fastcgi,Django提供了一个集成FLUP和处理程序的manage.py runfcgi

对于mod_wsgi,有一个核心处理程序。

如何安装WSGI支持?

遵循这些说明。

https://code.google.com/archive/p/modwsgi/wikis/IntegrationWithDjango.wiki

背景请看这个

http://docs.djangoproject.com/en/dev/howto/deployment/#howto-deployment-index

你可以以run WSGI over CGI as Pep333 demonstrates为例。但是,每次有请求时,都会启动一个新的Python解释器,并且需要构建整个上下文(数据库连接等),这都需要时间。

如果您想运行WSGI,最好的方法是您的主机安装mod_wsgi,并进行适当的配置,将控制权交给您的应用程序。

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

WSGI是一个很像CGI的协议,它定义了一组web服务器和Python代码如何交互的规则,它被定义为Pep333。这使得许多不同的web服务器可以使用相同的应用协议使用许多不同的框架和应用程序成为可能。这是非常有益的,使它非常有用。

我认为Florian's answer回答了您关于“什么是WSGI”的部分问题,特别是当您阅读the PEP时。

至于你最后提出的问题:

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)可以在请求到达时调用此函数。

这非常好的原因是,我们可以避免从HTTP GET/POST转换为CGI再转换为Python的混乱步骤,然后在退出时再次转换。这是一个更直接,更干净,更有效的联系。

如果一个请求所需要做的只是一个函数调用,那么在web服务器后面运行长时间运行的框架也会容易得多。对于普通的CGI,每个单独的请求都必须start your whole framework up

要获得WSGI支持,您需要安装一个WSGI模块(比如mod_wsgi),或者使用包含WSGI的web服务器(比如CherryPy)。如果这两种方法都不可行,您可以使用PEP中给出的CGI-WSGI桥。

相关问题 更多 >

    热门问题