理解CGI
CGI (Common Gateway Interface),常听说但不太明白。实际上一句话就可以概括:
"CGI offers a standard protocol for web servers to execute programs that execute like console applications (also called command-line interface programs) running on a server that generates web pages dynamically. " -Wiki
也就是说,CGI的作用就是把HTTP Server接收到的请求,转换为本机上其它应用程序(如Shell命令行、Python、Java等)可以理解的命令。也就是说,让网页的互动像直接与本地程序互动一样简单。
简而言之:
CGI就是一个语言转换器。将网络语言转换为具体的各种程序语言。
基于这个特性,CGI只是一个泛指。而针对不同的语言、程序,自然也就有不同的CGI来转换。
常见的CGI如下:
- 适于Python:
- WSGI
- mod_python
- 多语言适用:
- FastCGI (Python, node.js, PHP, Ruby, Java, Go, C++, Lua ...)
理解基于Python语言的WSGI
WSGI (Web Server Gateway Interface),是一种Python官方(PEP 333)制定的一个网络交互规范:客户端 -> HTTP服务器 -> WSGI -> Application(Wordpress/Flask/Django)。反过来发送给客户端也是一样。
每个语言对于网络服务器的处理可能不一样:如同Ruby的Rack。Python使用wsgi,即一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
wsgi是将HTTP Server的参数进行Python化
,封装为request对象传递给apllication命名的func对象并接受其传出的response参数,由于其处理了参数封装和结果解析,才有python世界web框架的泛滥,在python下,写web框架就像喝水一样简单。(参考:https://www.zhihu.com/question/19998865/answer/27033737)
有了这个东西,Flask或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了,不需要做任何特殊配置(也需要一些小小的配置调整)
"如全称代表的那样,WSGI不是服务器,不是API,不是Python模块,更不是什么框架,而是一种服务器和客户端交互的接口规范."
在客户端向服务器发出请求时,HTTP Server服务器接收请求,进行socket、tcp、udp等基层操作,全部验证通过后,再把请求内容发给WSGI。然后WSGI作为一个Python关口,把请求数据全部转换为Python程序能理解的信息,再把这些信息发送给具体的某个app应用,比如Flask,或Django。这时候,Flask等框架接收到的,就是一般的Python化的数据了,而不是网络规范的数据。也就是说,Flask等框架,完全无需考虑Protocols网络协议等东西,专心做好自己的网站就好了。
WSGI 组件
在WSGI规范下,web组件被分成三类:client, server, and middleware.