如何理解 CGI,WSGI

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解 CGI,WSGI相关的知识,希望对你有一定的参考价值。

CGI(Common Gateway Interface)可以说是一种替代用户直接访问服务器上文件而诞生的一种“代理”,用户通过CGI来获取动态数据或文件等。

从最原始的意义上来说,CGI是一种设计思想,其最早的实现是每次请求都直接调用操作系统来创建进程、销毁进程,这种程序虽然效率不高但是给WEB数据动态访问提供了很好的思路。

现在经过改进的CGI效率已经大大提高,尤其是fastCGI等实现。


WSGI是Web Server Gateway
Interface的简称,从名字上看和CGI一定有渊源。事实上,由于之前的CGI程序和编写WEB服务所用的语言往往是不同的(CGI用C,WEB用
php等),WSGI的其中一个目的就是让用户可以用统一的语言编写前后端,WSGI参考了CGI的设计,对CGI的设计思想进行了进一步包装。
参考:http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side

这么做执行效率当然不高,不过根据《黑客与画家》最后的预言,这些效率是值的牺牲了,未来谁知道呢。

总结来说:
1、CGI是一种为用户动态提供所需数据的设计思想,它有很多各种不同语言的实现。
2、WSGI是Python对CGI进行的一种包装,核心使用Python实现,具体实现通常来说也需要使用Python,目前Django、Google webapp框架都实现了WSGI。
参考技术A 著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:松鼠奥利奥
链接:https://www.zhihu.com/question/19998865/answer/13677082
来源:知乎

我对 CGI 的理解是利用程序的标准输入输出流,完成 HTTP 通信。HTTP 是文本协议,每次请求的文本以标准输入流的形式进入服务器端 CGI 程序,创建进程;然后进程的标准输出流作为响应 。
WSGI 和 CGI 原理极其相似,但是是完全不同的实现。WSGI 是 Python 专用的协议,也是输入&输出的方式传输文本流,但不是创建进程,而是对一个 WSGI 程序(callable 的对象,可以是函数也可以是实现了 __call__ 的对象),将 request 作为参数传入(不再是纯文本,而是经过包装),同样将经过包装的 response 作为响应返回。request/response 的包装由 Python 标准库提供。
二者都是标准,都有诸多实现。CGI 最为广泛,无论是二进制程序、perl 脚本、python 脚本还是 PHP 都可以以这样的原理提供 HTTP 服务;WSGI 在 Python 界也是公共标准,主流 Web 框架基本都有实现,例如 Bottle 的 bottle.Bottle (Application 对象)就实现了 WSGI 协议(见 __call__ 方法)。本回答被提问者采纳

wsgi & cgi的一些概念解释

可以看这里

https://www.zhihu.com/question/19998865

 

如何理解 CGI, WSGI?修改
写补充说明
举报 添加评论 分享 • 邀请回答
默认排序
按时间排序
15 个回答

17
赞同反对,不会显示你的姓名
[已重置]
17 人赞同
WSGI, Web Server Gateway Interface
如全称代表的那样,WSGI不是服务器,不是API,不是Python模块,更不是什么框架,而是一种服务器和客户端交互的接口规范!
更具体的规范说明请搜索“PEP 3333”。
在WSGI规范下,web组件被分成三类:client, server, and middleware.
WSGI apps(服从该规范的应用)能够被连接起来(be stacked)处理一个request,这也就引发了中间件这个概念,中间件同时实现c端和s端的接口,c看它是上游s,s看它是下游的c。
WSGI的s端所做的工作仅仅是接收请求,传给application(做处理),然后将结果response给middleware或client.除此以外的工作都交给中间件或者application来做。
发布于 2014-05-29 1 条评论 感谢 分享 收藏 • 没有帮助 • 举报 • 作者保留权利

44
赞同反对,不会显示你的姓名
hellocode 闭关修炼
44 人赞同
正好最近在学习CGI。

CGI是比较原始的开发动态网站的方式。你可以想象一下,一个网站的动态内容肯定是程序生成的,光是静态的html页面无法达到这个效果。那么,这个程序就需要接受客户端的请求,然后进行相应处理,再返回给客户端,客户端和服务端的通信当然是通过HTTP协议。

然后我们会发现,这个程序在处理客户端请求的时候,大部分时候会进行很多重复的工作,比如说HTTP请求的解析。也就是说,你的程序需要解析HTTP请求,我的程序也需要解析。

于是为了DRY原则,Web服务器诞生了。(以下所说的都是CGI的工作模式)

于是Web服务器可以解析这个HTTP请求,然后把这个请求的各种参数写进进程的环境变量,比如
REQUEST_METHOD,PATH_INFO之类的。之后呢,服务器会调用相应的程序来处理这个请求,这个程序也就是我们所要写的CGI程序了。它会负责生成动态内容,然后返回给服务器,再由服务器转交给客户端。服务器和CGI程序之间通信,一般是通过进程的环境变量和管道。

这样做虽然很清晰,但缺点就是每次有请求,服务器都会fork and exec,每次都会有一个新的进程产生,开销还是比较大的。

原因在与CGI程序是一个独立的程序,它是可以独立运行的(在提供HTTP请求的情况下),它可以用几乎所有语言来写,包括perl,c,lua,python等等。所以对于一个程序,服务器只能以fork and exec的方式来调用它了。

我所理解的CGI差不多就是这样。
编辑于 2014-08-30 9 条评论 感谢 分享 收藏 • 没有帮助 • 举报 • 作者保留权利

44
赞同反对,不会显示你的姓名
轩脉刃 名不见经传码农,体制内的小愤青,躁动的…
44 人赞同
cgi是通用网关接口,是连接web服务器和应用程序的接口。

web服务器负责接收http请求,但是http请求从request到response的过程需要有应用程序的逻辑处理,web服务器一般是使用C写的,比如nginx,apache。而应用程序则是由各种语言编写,比如php,java,python等。这两种语言要进行交互就需要有个协议进行规定,而cgi就是这么个网关协议。

拿nginx+fastcgi+php为例子,nginx里面的fastcgi模块实现cgi的客户端,php的cgi-sapi实现cgi的服务端。

WSGI就是Python的CGI包装,相对于Fastcgi是PHP的CGI包装

 

以上是关于如何理解 CGI,WSGI的主要内容,如果未能解决你的问题,请参考以下文章

Python Web 框架、WSGI 和 CGI​​ 如何组合在一起

WSGI、CGI、FastCGI 和 mod_python 在 Python 方面的区别和用途?

WSGI&ASGI

如何查看wsgi的版本

Web开发:CGI和WSGI

如何在 IIS 下设置 Python WSGI 服务器?