在学习一个东西以前,咱们确定想知道:它为何会出现?那么,WSGI为何会出现呢?html
咱们知道,部署一个web应用,常常须要使用nginx、apache或者IIS等web服务器把web应用跑起来,而后用户在浏览器能够经过URL进行访问。前端
为了可以让各类web服务器都能支持web应用,因此必须在web应用和web服务器之间有一个统一的规范(协议)。python
其实,在PEP 3333中也有提到它的目标:nginx
为了定义了一个“ Web 服务器和 Python Web 应用程序或框架之间”的标准接口,以便提高 Web 应用程序在不一样 Web 服务器上的可移植性。git
注意:github
一、这里的web应用是Python Web应用程序。web
二、这里的web服务器是指nginx、apache等。apache
三、WSGI为何会出如今WSGI有更加详细的说明。浏览器
https://github.com/python/peps/blob/master/pep-0333.txt服务器
WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。
更精确的说,应该是一种协议或规范:描述web server
如何与web application
通讯的规范。server
和application
的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI
协议之上的web
框架有Bottle
, Flask
, Django
。
它是一个标准,描述了一个web server和web app如何通信,以及webapp怎么处理前端请求。一个web服务流程相似于这样:
WSGI的主要做用是在Web服务器(uwsgi)和Web应用程序(application)承担“翻译官”的角色。对于这一角色能够这样理解:
根据以上分析,要实现符合WSGI标准的Web服务,服务器和应用程序的设计就要符合WSGI规范。
这里引伸出一个概念:uwsgi
uwsgi定义:与WSGI
同样,是一种通讯协议,是uWSGI
服务器的独立协议。是一个web
服务器,实现了WSGI
协议、uwsgi
协议、http
协议等。
用于定义传输信息的类型(type of information
),每个uwsgi packet
前4byte
为传输信息类型的描述,与WSGI协议是两个不一样的协议,听说该协议是fcgi
协议的10倍快。
由于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。
Werkzeug是什么鬼呢?Werkzeug是一个WSGI工具包,他能够做为一个Web框架的底层库。Flask就用到了这个库。Flask主要用到了Werkzeug和jinja2两个库。
Werkzeug官方文档说明以下:
werkzeug ~~~~~~~~ Werkzeug is the Swiss Army knife of Python web development. Werkzeug是python web开发的一把瑞士军刀。 It provides useful classes and functions for any WSGI application to make the life of a python web developer much easier. All of the provided classes are independent from each other so you can mix it with any other library. 它为WSGI应用提供了有用的类和函数,让python的web开发工做更容易。Werkeug提供的全部类都是彼此解耦的,因此你可以使用其余任何库进行糅杂。 (翻译不是很是到位,哈哈)
最后以 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,我收到了,我把响应结果返回给客户端。你们合做愉快~