普通英语的WSGI和CGI是什么?


Answers:


60

WSGI在Web服务器启动时(作为Web服务器进程的一部分(嵌入式模式)或作为单独的进程(守护程序模式))运行Python解释器,并将脚本加载到其中。每个请求都会导致调用脚本中的特定功能,并将请求环境作为参数传递给该功能。

CGI将脚本作为每个请求的单独进程运行,并使用环境变量,stdin和stdout与之“通信”。


15
WSGI!= mod_wsgi。您的语言表明您的意思是mod_wsgi,它是WSGI的实现。WSGI本身只是一个规范,可以用许多不同的方式实现,包括在CGI之上。
Graham Dumpleton 2011年

@Graham:您是说没有其他WSGI容器支持在那些模式下运行WSGI应用程序吗?
伊格纳西奥·巴斯克斯·阿布拉姆斯

3
从技术上讲,人们可能会说,除了这两种方法之外,还有很多其他细微的变化,至少在嵌入式系统中如何启动流程或如何激活代码方面是如此。因此,只需要小心地将事物归纳为这两类即可。从总体上讲,您可能会说出自己拥有的东西,但是要想深入研究,它的意义不只这些。
Graham Dumpleton'2

1
@GrahamDumpleton,出于好奇,您介意解释如何在CGI之上实现WSGI吗?
Yoland

2
阅读WSGI规范。它显示了一个示例CGI / WSGI桥。python.org/dev/peps/pep-3333/#the-server-gateway-side要获得更强大的实现,请参见github.com/GrahamDumpleton/cgi2wsgi严重的是,总的来说,您应该避免使用CGI。
Graham Dumpleton '16

255

从完全后退的角度来看,Blankman,这是我的Web服务网关接口的“简介页”:

第一部分:网络服务器

Web服务器提供响应。他们坐在那里,耐心等待,然后突然没有任何警告:

  • 客户端进程发送请求。客户端进程可以是Web服务器,机器人,移动应用程序等。简直就是“客户”
  • Web服务器收到此请求
  • 故意咕umble各种事情发生(见下文)
  • Web服务器将某些内容发送回客户端
  • Web服务器再次坐在附近

Web服务器(至少是更好的服务器)在这方面非常擅长。他们根据需求扩展和缩减处理,通过可靠的网络可靠地与最薄弱的客户进行对话,而我们永远不必担心。他们只是继续服役。

这就是我的观点:Web服务器就是:服务器。他们对内容一无所知,对用户一无所知,实际上除了如何耐心等待和可靠答复外,一无所知。

您选择的Web服务器应该反映您的交付偏好,而不是您的软件。您的网络服务器应负责服务,而不是处理或逻辑事务。

第二部分:(PYTHON)软件

软件不存在。软件仅在执行时存在。当软件在其环境中发生意外更改(文件不在期望的位置,重命名参数等)时,软件并不适应。尽管优化应该是设计的中心原则(当然),但是软件本身并不能优化。开发人员乐观。软件执行。软件会执行上面“故意含糊不清”部分中的所有内容。可以是任何东西。

您对软件的选择或设计应反映您的应用程序,功能的选择,而不是Web服务器的选择。

这是将语言“编译”到Web服务器的传统方法变得很痛苦的地方。您最终将代码放入应用程序中以应对物理服务器环境,或者至少被迫选择一个适当的“包装”库以在运行时包括在内,从而使跨Web服务器具有统一性的错觉。

那么WSGI是什么?

那么,最后,WSGI是什么?WSGI是一套规则,分为两部分。编写它们的方式可以将它们集成到任何欢迎集成的环境中。

为Web服务器端编写的第一部分说:“好吧,如果您要处理WSGI应用程序,则这是该软件在加载时的思考方式。这是您必须为应用程序提供的内容,这里是您可以期望每个应用程序具有的界面(布局)。此外,如果出现任何问题,这是应用程序的思维方式以及期望行为的方式。”

为Python应用程序软件编写的第二部分说:“好吧,如果您要处理WSGI服务器,这是服务器与您联系时的思考方式。这是您必须向服务器提供的东西,以及这是您可以期望每台服务器都具有的接口(布局)。此外,如果出现任何问题,这是您的行为方式,也应该告诉服务器。”

因此,有了它-服务器将成为服务器,软件将成为软件,这是它们可以很好地相处的一种方式,而不必为彼此的细节留出余地。这是WSGI。

mod_wsgi的,而另一方面,是Apache的一个插件,让它跟WSGI兼容的软件,换句话说,mod_wsgi的是一个实现 -在Apache中-上面的规则手册第一部分的规则。

至于CGI ....问其他人:-)


21
我希望不要以“问别人”来结束该答案,而是希望有人编辑此答案以包含CGI的相同方式。
布鲁诺·布鲁诺斯基

1
“服务器将是服务器,软件将是软件”-“服务器来自火星,软件来自金星” :)
Rahul

22

如果您不清楚这个领域中的所有术语,并且让我们面对现实,那是一个令人困惑的首字母缩写词,那么还有一个很好的背景阅读器,以官方的Python HOWTO形式提供,它讨论了CGI,FastCGI,WSGI等。上。希望我先读。


21

CGI和WSGI都定义了标准接口,程序可以使用这些标准接口来处理Web请求。CGI接口的级别低于WSGI,它涉及服务器设置环境变量,该环境变量包含HTTP请求中的数据,程序返回的格式类似于裸HTTP服务器响应。

另一方面,WSGI是特定于Python的更高级别的接口,它使程序员可以编写与服务器无关的应用程序,并且可以将其包装在其他WSGI应用程序(中间件)中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.