什么是简单英语中的 WSGI 和 CGI?

每次我读 WSGI 或者 CGI 的时候,我都感到害怕。我以前试过读这本书,但是没有什么真正坚持下来。

用通俗易懂的话说,它到底是什么?

它是否只是将请求管道到终端并重定向输出?

28731 次浏览

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

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

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

另一方面,WSGI 是一个特定于 Python 的、稍微高级一些的接口,它允许程序员编写与服务器无关的应用程序,并且可以封装在其他 WSGI 应用程序(中间件)中。

从一个完全后退的角度来看,布兰克曼,这里是我的 Web服务器网关接口介绍页:

第一部分: 网络服务器

网络服务器提供响应,他们坐在那里耐心地等待,然后突然毫无预兆地:

  • 客户端进程发送请求。客户端进程可以是一个网络服务器,一个机器人,一个移动应用程序,无论什么。它只是“客户”
  • Web 服务器接收这个请求
  • 各种各样的事情发生了(见下文)
  • Web 服务器向客户端发送回一些内容
  • 网络服务器又无所事事了

Web 服务器(至少是更好的服务器)非常擅长这个。他们根据需求扩大或缩小处理规模,他们可靠地与最古怪的客户通过非常糟糕的网络进行对话,我们从来不必真正担心这个问题。他们只是继续服务。

这就是我的观点: 网络服务器仅仅是: 服务器。他们对内容一无所知,对用户一无所知,事实上,除了知道如何等待和可靠地回复之外,他们一无所知。

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

第二部分: (蟒蛇)软件

软件不会无所事事。软件只在执行时存在。当遇到环境的意外变化(文件不在预期的位置,参数被重命名等等)时,软件并不是特别容易适应。尽管优化应该是你设计的中心原则(当然) ,软件本身并不优化。开发者优化。软件执行。软件完成了上面“故意咕哝”部分中的所有工作。什么都有可能。

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

这就是将语言“编译”到 Web 服务器的传统方法变得痛苦的地方。你最终会在应用程序中放入代码来应对物理服务器环境,或者至少被迫在运行时选择一个合适的“包装器”库,以便在整个 Web 服务器中产生一致性的错觉。

WSGI 是什么?

那么,WSGI 到底是什么呢?WSGI 是 一套规则,由两部分组成。它们的编写方式使得它们可以集成到任何欢迎集成的环境中。

第一部分是为 web 服务器端编写的,它说: “好的,如果你想处理一个 WSGI 应用程序,这里是软件加载时的思路。下面是您必须让应用程序可用的内容,以及您可以期望每个应用程序都具有的接口(布局)。此外,如果出现任何问题,以下是应用程序将如何思考,以及你可以期望它如何表现。”

第二部分是为 Python 应用程序软件编写的,它说: “好的,如果您想处理 WSGI 服务器,以下是服务器在与您联系时的思路。下面是您必须为服务器提供的内容,以及您可以期望每个服务器都具有的接口(布局)。此外,如果出现任何问题,以下是您应该如何行事的方式,以及您应该告诉服务器的方式。”

这就是了——服务器就是服务器,软件就是软件,这里有一种方法,它们可以相处得很好,不需要一方考虑另一方的具体情况。这里是 WSGI。

另一方面,mod _ wsgi 是 Apache 的一个插件,它允许 Apache 与符合 WSGI 的软件进行对话,换句话说,mod _ wsgi 是上面规则手册第一部分规则的 实施(在 Apache 中)。

至于 CGI... ... 问问别人: -)

如果你不清楚这个领域的所有术语,让我们面对它,这是一个令人困惑的首字母缩略词,也有一个很好的背景阅读器在 官方蟒蛇的形式,讨论 CGI 对 FastCGI 对 WSGI 等等。真希望我先看了。