CGI WSGI

CGI(Common Gateway Interface)

如果客户端的需求只是静态文件(比如静态 html), 那么服务器只需要把静态文件传送给客户端就行了.
但事实上需求多种多样, 我们需要由程序动态生成的内容. 我们当然可以把这部分功能结合在 web服务器里, 但这样一来随着需求日益增多, 服务器程序很快就无法维护了...
因此 web 服务器只保留最基本功能(解析http请求等), 而把具体对资源的处理放入另外的程序.这些程序根据CGI(协议)从环境变量或标准输入得到请求信息, 并通过标准输出返回给服务器.
但这种分离的坏处是每次CGI请求都会运行CGI程序(产生新的进程), 结束时销毁, 增加负荷, 效率不高.因为每个 CGI 进程只处理一个请求,换句话说,每个请求都需要创建一个 CGI 进程处理,CGI 程序处理完毕后就退出了。

对一个 CGI 程序,做的工作其实只有:从环境变量(environment variables)和标准输入(standard input)中读取数据、处理数据、向标准输出(standard output)输出数据。

WSGI(Python Web Server Gateway Interface,缩写为WSGI)

WSGI只是一份标准,一个两边接口方式的约定(Web服务器与Web应用程序之间)
WSGI更像一个协议。只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行
一个符合wsgi规范的web server,接收request请求,封装一系列环境变量,按照wsgi规范调用注册的wsgi app,最后将response返回给客户端。
WSGI将 web 组件分为三类: web服务器,web中间件,web应用程序, wsgi基本处理模式为 : WSGI Server -> (WSGI Middleware)* -> WSGI Application 。

WSGI 与 CGI 类似, 不过不是另外开辟一个进程, 而是调用一个 WSGI 程序(callable 对象), 其中 environ 变量(包含请求参数信息), start_response (作为回调函数使用, 让 WSGI 程序可以设置响应头部, 更加灵活) 作为参数.
WSGI 流程大概下面这个样子:
服务器启动加载一个 WSGI 程序(callable 对象, 可能由框架提供)
服务器建立连接,读取请求并解析, 然后创建一个 environ 字典, 服务器程序还会实现一个 start_response 方法, 用于在应用内部更改响应头部
服务器将 environ 和 start_response 作为参数, 调用 WSGI 程序, 并得到返回的数据
服务器将得到的数据和由 start_response(WSGI 程序内部调用) 设置的响应头部来构造 HTTP 响应, 并返回给客户端

参考:https://www.biaodianfu.com/cgi-fastcgi-wsgi.html
http://www.jianshu.com/p/4cea972770f4

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容