WSGI /与/ uWSGI
在阿里云上部署项目时,在通信中我们都会用到wsgi与uWSGI,这此我就带大家来了解一下wsgi与uWSGI。
对了,上次有个朋友问我Django的生命周期是什么?我在下一篇博客中给大家讲解一下。
WSGI
WSGI是Web Server Gateway Interface的缩写。他是PythonWeb服务器网关接口,
是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受,
它已基本达成它的可移植性方面的目标。
其实我觉得他更像一个协议,他可以运行在任何服务器上WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。
CLIENT:客户端 SERVER:服务器 APPLICATION:应用器
(图片有些模糊,可以放大看)
从这副图中我们可以看出,应用他必须是一个可调用对象,也可以是一个函数,
也可以是一个可以实现__call__()的方法,每收到一个请求,APPLICATION(应用器)会调用应用。
应用在处理完这些数据,准备返回数据的时候,先调用服务传给它的函数,最后再返回可迭代对象作为数据。
在上图中,黄色到绿色之间有一个environ,他包括了请求的相关信息,
比如请求方式、请求路径等等,start_response是应用处理完毕后,需要调用的函数,
用于告诉服务设置响应的头部信息或错误处理等等,他必须是一个字典,
如::{请求信息:’***’,请求方式:’****’,请求路径:’****’}。
我们先定义一个可调用的函数,它可以使用服务器传给它的请求相关的内容 environ,
然后是服务器:可以在项目文件中找到wsgi_server.py
uWSGI ,uWSGI全称(Web Server Gateway Interface)
python安装uWSGI : : https://www.runoob.com/python3/python-uwsgi.html
uWSGI也是一个web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
他不是一个框架,一个软件,或者是API,而只是一种规范描述web server如何与web application通信的规范。
WSGI协议主要包括server和application两部分
===========================
底层内容:有兴趣可以了解一下,没有兴趣勿看
WSGI server负责从客户端接收请求,将request转发给application,将application返回的response返回给客户端;
WSGI application接收由server转发的request,处理请求,并将处理结果返回给server。
application中可以包括多个栈式的中间件(middlewares),这些中间件需要同时实现server与application,
因此可以在WSGI服务器与WSGI应用之间起调节作用,
对服务器来说,中间件扮演应用程序,对应用程序来说,中间件扮演服务器。
uWSGI使用通用的API和通用的配置风格来实现应用服务器 (对于各种编程语言和协议),代理,进程管理器和监控器。
核心 :》 (实现配置、进程管理、socket创建、监控、日志记录、共享内存块、ipc、集群成员和 uWSGI订阅服务器)
请求插件:》 (为各种语言和平台实现应用服务器接口:WSGI, PSGI, Rack, Lua WSAPI, CGI, PHP, Go ...)
网关:》 (实现负载均衡器、代理和路由器)
Emperor :》(实现大量实例管理和监控)
循环引擎 :》(实现事件和并发,组件可以在reforking, threaded, asynchronous/evented和green thread/coroutine模式下运行。支持多种技术,
包括uGreen, Greenlet, Stackless, Gevent, Coro::AnyEvent, Tornado, Goroutines和Fibers)
django WSGI application :django项目中可以找到
WSGI application应该实现为一个可调用对象,例如函数、方法、类(包含`call`方法)。需要接收两个参数:
- 一个字典,该字典可以包含了客户端请求的信息以及其他信息,
可以认为是请求上下文,一般叫做environment(编码中多简写为environ、env)
- 一个用于发送HTTP响应状态(HTTP status )、响应头(HTTP headers)的回调函数
通过回调函数将响应状态和响应头返回给server,同时返回响应正文(response body),
响应正文是可迭代的、并包含了多个字符串。
下面是Django中application的具体实现部分:
可以看出application的流程包括:
1,加载所有中间件,以及执行框架相关的操作,设置当前线程脚本前缀,发送请求开始信号;
2,处理请求,调用get_response()方法处理当前请求,该方法的的主要逻辑是通过urlconf找到对应的view和callback,
按顺序执行各种middleware和callback。
3,调用由server传入的start_response()方法将响应header与status返回给server。
4,返回响应正文
下面表示WSGI server服务器处理流程中关键的类和方法。