python wsgi 简介
基础知识
uWSGI ,WSGI和uwsgi的区别
WSGI:
WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。也可以认为WSGI是一种通信协议。自从 WSGI 被开发出来以后,许多其它语言中也出现了类似接口。
WSGI 的官方定义是,the Python Web Server Gateway Interface。从名字就可以看出来,这东西是一个Gateway,也就是网关。网关的作用就是在协议之间进行转换。
WSGI 是作为 Web 服务器与 Web 应用程序或应用框架之间的一种低级别的接口,以提升可移植 Web 应用开发的共同点。WSGI 是基于现存的 CGI 标准而设计的。
WSGI是Web 服务器(uWSGI)与 Web 应用程序或应用框架(Django)之间的一种低级别的接口
uWSGI:
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
uwsgi:
uwsgi是服务器和服务端应用程序的一种协议,规定了怎么把请求转发给应用程序和返回; uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信
为了方便理解,uWSGI ,WSGI和uwsgi在网站项目流程图中的功能如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hTCUGMx3-1574995620965)(assets/1454579-20181209002415550-68432975.png)]
Python 知识
- iterator 和 generator
- 函数的高级用法:嵌套函数,作为参数传递等等
- 了解 decorator 会对理解 wsgi 有很大的帮助
- python 的 callable 概念
- classmethod 和 staticmethod 的概念
- web 编程的基础
HTTP 基础
对于 web 应用程序来说,最基本的概念就是客户端发送请求(request),收到服务器端的响应(response)。
下面是简单的 HTTP 请求:
GET /Index.html HTTP/1.1\r\n
Connection: Keep-Alive\r\n
Accept: */*\r\n
User-Agent: Sample Application\r\n
Host: www.microsoft.com\r\n\r\n
内容包括了 method、 url、 protocol version 以及头部的信息。而 HTTP 响应(不包括数据)可能是如下的内容:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0\r\n
Content-Location: http://www.microsoft.com/default.htm\r\n
Date: Tue, 25 Jun 2002 19:33:18 GMT\r\n
Content-Type: text/html\r\n
Accept-Ranges: bytes\r\n
Last-Modified: Mon, 24 Jun 2002 20:27:23 GMT\r\n
Content-Length: 26812\r\n
实际生产中,python 程序是放在服务器的 http server(比如 apache, nginx 等)上的。现在的问题是 **服务器程序怎么把接受到的请求传递给 python 呢,怎么在网络的数据流和 python 的结构体之间转换呢?**这就是 wsgi 做的事情:一套关于程序端和服务器端的规范,或者说统一的接口。
WSGI
我们先看一下面向 http 的 python 程序需要关心哪些内容:
- 请求
- 请求的方法 method
- 请求的地址 url
- 请求的内容
- 请求的头部 header
- 请求的环境信息
- 响应
- 状态码 status_code
- 响应的数据
- 响应的头部
WSGI(Web Server Gateway Interface) 的任务就是把上面的数据在 http server 和 python 程序之间简单友好地传递。它是一个标准,被定义在PEP 333。需要 http server 和 python 程序都要遵守一定的规范,实现这个标准的约定内容,才能正常工作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zVnb5aDZ-1574995620965)(assets/wsgi-interface.png)]
应用程序端
WSGI 规定每个 python 程序(Application)必须是一个可调用的对象(实现了__call__
函数的方法或者类),接受两个参数 environ
(WSGI 的环境信息) 和 start_response
(开始响应请求的函数),并且返回 iterable。几点说明:
environ
和start_response
由 http server 提供并实现environ
变量是包含了环境信息的字典Application
内部在返回前调用start_response
start_response
也是一个 callable,接受两个必须的参数,status
(HTTP状态)和response_headers
(响应消息的头)- 可调用对象要返回一个值,这个值是可迭代的。
看看具体代码的实现:
# 1. 可调用对象是一个函数
def application(environ, start_response):
response_body = 'The request method was %s' % environ['REQUEST_METHOD']
# HTTP response code and message
status = '200 OK'
# 应答的头部是一个列表,每对键值都必须是一个 tuple。
response_headers = [