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包装
时间: 2024-10-31 08:16:16

wsgi & cgi的一些概念解释的相关文章

faster-rcnn原理及相应概念解释

R-CNN --> FAST-RCNN --> FASTER-RCNN R-CNN: (1)输入测试图像: (2)利用selective search 算法在图像中从上到下提取2000个左右的Region Proposal: (3)将每个Region Proposal缩放(warp)成227*227的大小并输入到CNN,将CNN的fc7层的输出作为特征: (4)将每个Region Proposal提取的CNN特征输入到SVM进行分类: (5)对于SVM分好类的Region Proposal做边

SAP ABAP之第一,二,三代出口类型BADI实现 概念解释

BADI是用户的第三代出口类型,我们来看看其具体的是如何实现的. 一,用户出口的类型 1,第一代 sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求.这类增强都需要修改sap的标准代码.示例:USEREXIT.. in SAPMV45A 2,第二代 sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现. 3,第三代 sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCOD

使用CGLIB实现AOP功能与AOP概念解释

使用CGLIB实现AOP功能 在Java里面,我们要产生某个对象的代理对象,这个对象必须要有一个特点,即这个对象必须实现一个接口,动态代理技术只能基于接口进行代理.有时候我们在做开发的时候,这个对象就没有实现接口,有人可能会说,它既然没有接口,那我就给它定义一个接口,这是不行的,因为有时候我们拿到一个对象,而这个对象是服务器产生给我们的,是服务器提供给我们的,又不是我们自己写的,动不动就给它定义一个接口,给它找个爸爸,哪那行呢?但我们现在要对它进行增强,这时用动态代理技术就不行了,动态代理技术只

AWS的区域和可用区概念解释

AWS的每个区域一般由多个可用区(AZ)组成,而一个可用区一般是由多个数据中心组成.AWS引入可用区设计主要是为了提升用户应用程序的高可用性.因为可用区与可用区之间在设计上是相互独立的,也就是说它们会有独立的供电.独立的网络等,这样假如一个可用区出现问题时也不会影响另外的可用区.在一个区域内,可用区与可用区之间是通过高速网络连接,从而保证有很低的延时. 通过多个可用区实现高可用性与几乎所有其他技术基础设施提供商不同的是,每个 AWS 区域都包含多个可用区和数据中心.自 2006 年开始运行领先的

【PHP 一些专业词汇+概念解释】

PHP    弱类型语言,大小写敏感,脚本语言(解释性,文本文件执行),服务端. OOP [Object Oriented Programming] SAPI [Server Application Programming Interface ] link 服务器端应用编程端口.它就是PHP与其它应用交互的接口,PHP脚本要执行有很多种方式,通过Web服务器,或者直接在命令行下,也可以嵌入在其他程序中.SAPI提供了一个和外部通信的接口,常见的SAPI有:cgi .fast-cgi.cli.is

Spring第九弹—使用CGLIIB实现AOP功能与AOP概念解释

JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理,原理之前我已经讲过.JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口.如果想代理没有实现接口的继承的类,该怎么办?现在我们可以使用CGLIB包. PS:需要引入com.springsource.net.sf.cglib-2.2.0.jar包. CGLIB是一个强大的高性能的代码生成包.它广泛的被许多AOP的框架使用,例如:Spring AOP和dynaop,为他们提供方法的int

概念解释:对称加密、非对称加密、公钥、私钥、签名、证书

楔子 现在网络的安全性已经变得越来越重要,各位程序员在开发过程中或多或少都会遇到公钥.私钥.加密.签名等一些相关名词.这些概念比较杂乱,容易混淆,下面就来梳理一下这部分的内容. 对称加密 在重要的信息的传递过程中,人们总是希望信息不会被偷看.不会被篡改,伪造等.为了达到这个要求人们一直在不断努力着. 电报加密使用的密码本,就是初代网络安全所使用的加密方式,用法为:发信时将内容翻译为密文发出,收到电报的一方,使用相同的密码本才能解密出正确的信息,否则看到的就是一堆乱码. 这种传统的加密方式就叫做对

ReactiveCocoa概念解释篇

1.ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Cocoa结尾. 2.ReactiveCocoa作用 在我们iOS开发过程中,经常会响应某些事件来处理某些业务逻辑,例如按钮的点击,上下拉刷新,网络请求,属性的变化(通过KVO)或者用户位置的变化(通过CoreLocation).但是这些事件都用不同的方式来处理,比如action.delegate.KVO.

linux下Bash局部变量及信号捕捉等概念解释

1.脚本配置文件 /etc/rc.d/init.d/服务脚本可支持配置文件,并放置在/etc/sysconfig/下同名的配置文件 2.局部变量:只对本函数内部等有效,关键字为local 以两个脚本显示变量带或不带local时的区别 2.1编写如下脚本:vim A1.sh #!/bin/bash A=1 SUM() { A=8 } SUM  调用函数 for I in `seq $A 10`; do echo -n "$I   " done echo ./A1.sh:执行脚本显示结果如