Flask学习-WSGI

一、WSGI为什么会出现?

在学习一个东西之前,我们肯定想知道:它为什么会出现?那么,WSGI为什么会出现呢?

我们知道,部署一个web应用,经常需要使用nginx、apache或者IIS等web服务器把web应用跑起来,然后用户在浏览器可以通过URL进行访问。

为了能够让各种web服务器都能支持web应用,所以必须在web应用和web服务器之间有一个统一的规范(协议)。

其实,在PEP 3333中也有提到它的目标:

为了定义了一个“ Web 服务器和 Python Web 应用程序或框架之间”的标准接口,以便提升 Web 应用程序在不同 Web 服务器上的可移植性。

注意:

1、这里的web应用是Python Web应用程序。

2、WSGI为什么会出现在WSGI有更加详细的说明。

https://github.com/python/peps/blob/master/pep-0333.txt

二、什么是WSGI?

WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。

更精确的说,应该是一种协议或规范:描述web server如何与web application通信的规范。serverapplication的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI协议之上的web框架有BottleFlaskDjango

它是一个标准,描述了一个web server和web app如何通讯,以及webapp怎么处理前端请求。一个web服务流程类似于这样:

 

 这里还有一个概念:uwsgi

uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独立协议,用于定义传输信息的类型(type of information),每一个uwsgi packet4byte为传输信息类型的描述,与WSGI协议是两个不同的协议,据说该协议是fcgi协议的10倍快。
uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。

 

三、WSGI实现

因为WSGI其实就是一个协议,根据官方的定义,大致内容如下:

● WSGI application能够调用python对象(函数或者一个带有__call__方法的类。__call__方法有2个参数:第一个参数是WSGI的environ,第二个参数是一个start_response函数。
● application必须使用start_response(status,headers),并且返回值是一个可迭的代序列,序列中的每个对象将标准输出。
● WSGI environ和CGI environ一样,都是一些键值对,要么是提供给server,要么提供给middleware。
● 可以将包装后的middleware添加到你的app中。

 下面是一个简单的例子:

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return '<h1>Hello, web!</h1>'

  

作为web app本身,你就算启动了程序,你也没办法给application传递参数。

所以,实际上,调用application和传递2个参数的动作,是web 服务器来进行的,比如uwsgi.

而这个叫做application的东西,在Flask框架内部的名字,叫做wsgi_app。

四、结束语

最后以 Nginx(web server),WSGI,Flask(web app) 之间的对话结束本文。 

===========================================================
Nginx:Hey,WSGI,我刚从用户那里收到了一个请求,现在转发给你。 
WSGI:好的,Nginx,我会设置好环境变量,然后将这个请求传递给Flask处理。 
Flask:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。 
WSGI:All right,那我等你。 
Flask:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。 
WSGI:Good job!Nginx,这里是响应结果,已经按照要求给你传递回来了。 
Nginx:Cool,我收到了,我把响应结果返回给客户端。大家合作愉快~

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/skyflask/p/9193828.html