一直以来,给外部系统提供服务,都是使用 RESTful API 方式。但是对于更多的用户来说,更喜欢的是使用浏览器直接打开页面,点击几个按钮来操作。所以在此基础上,学习了一下 Flask,接触到了 uWSGI,这里进行总结一下。

WSGI

说到 uWSGI,需要先理解一下 WSGI。

对于一个 Web 服务来说,处理用户的请求的过程如下:

  1. 用户使用浏览器,发起 HTTP 请求;
  2. Web 服务器根据接收到请求,生成对应的 HTML 文档;
  3. Web 服务器将 HTML 文档,作为 Response 发送给浏览器;
  4. 浏览器收到 HTML 文档,渲染展示出来给用户;

对于静态页面,即 HTML 文档内容固定不变,可以用现在很成熟的 Nginx 等 Web 服务器来实现。

对于动态页面,即 HTML 文档需要根据不同用户请求的不同内容来生成,就需要自己来实现 Web 服务器了。但是如果对于基本的 HTTP 协议都去开发一遍的话,工作量就太大了。

所以更好的方式是,由 Nginx 这些成熟的 Web 服务器来负责接收处理 HTTP 等请求,而我们自己的应用程序,专心负责生成对应的 HTML 文档,这就是 WSGI 的意义了。

WSGI(Web Server Gateway Interface),是 Python 应用程序(或框架)与 Web 服务器之间的一种接口规范。只要遵循这个接口规范,开发者实现的 Python 应用程序就可以和 Web 服务器进行对接。

WSGI 是专指 Python 和 Web 服务器之间的接口规范,同时还有其他例如 CGI、FastCGI、Servlet等规范,其对比如下:

规范 说明
CGI Common Gateway Interface,最早出现的外部扩展应用程序与 Web 服务器交互的标准接口。
FastCGI FastCGI 是 CGI 的优化版本,CGI 每次执行都需要 fork 一次,效率很低,而 FastCGI 是常驻类型,且支持分布式的运算,大大提高了性能。
Servlet Java 专用的外部扩展应用程序与 Web 服务器交互的标准接口。
WSGI Python 专用的外部扩展应用程序与 Web 服务器交互的标准接口。

uWSGI

uWSGI 是一个遵循 WSGI 规范的 Web 服务器,它实现了 WSGI、uwsgi、HTTP 等协议。

uwsgi

uwsgi 是 uWSGI 服务器使用的本地协议。

uwsgi 是一个二进制协议,可以携带任何类型的数据。一个 uwsgi 分组的前 4 个字节,描述了这个分组包含的数据类型。

由于 uwsgi 使用二进制来存储数据,比 FastCGI 这种字符存储数据,在存储空间和解析速度上有很大的优势。

参考地址