WSGI
背景
在web的开发中,服务器端的程序,可以分为服务器程序(框架),与应用程序(业务逻辑处理)。服务器程序(框架)负责将客户端的http请求接收,整理。而应用程序负责具体的业务逻辑处理。
一般为了方便开发,经常将服务器程序的功能封装起来,成为各种web开发框架,比如Flask、Django等,不同的框架具有不同的开发方式,但是无论如何,开发出来的应用程序必须和框架相互配合,才能为用户提供服务。
因此服务器程序需要为不同的框架提供不同的支持,这样混乱的局面对服务器程序与框架都不友好。标准化变得尤为的重要。需要一个标准,似的服务器程序支持这个标准,同时框架也支持这个标准,这样服务器程序可以支持多个框架,而框架也可以支持多个服务器程序。
在Python的web开发中,这个标准被称为 the web server gateway interface,简称为WSGI。
WSGI是什么
WSGI是服务器程序与应用程序之间约定的标准,规定了双方按照什么样的接口,提供什么功能,以便以最小的代价实现两者的配合使用。
WSGI不能规定的太复杂,否则对于服务器程序来说,实现起来比较困难,不利于WSGI的普及。
WSGI也不能规定的太多,例如cookie就没有规定。这样可以给予框架最大的灵活性,WSGI不是为了成为一个web框架的标准。
另外,WSGI需要使得middleware(中间件)易于实现。middleware处于服务器程序与应用程序之间,对于服务程序,middleware相当于应用程序,而对于应用程序,middleware相当于服务器程序,这样,对用户请求的处理,可以变成多个middleware叠加在一起,每个middleware实现不同的功能。可以方便的添加或者替换middleware,以便对用户的请求作出不同的处理。
WSGI内容概述:应用程序
对于应用程序,WSGI的规定包括:
- 应用程序需要是一个可调用的对象;
- 可调用对象接收两个参数;
- 可调用对象要返回一个值,这个值是可迭代的。
在Python值,一个可调用的对象可以是:
- 函数
- 一个实例,其类实现了__call__方法;
- 一个类,用这个类生成的实例的过程相当于调用了这个类。
因此,在Python中,应用程序应该看起来是这样的:
HELLO_WORLD = b"Hello world!\n"
# callable function
def application(environ, start_response):
return [HELLO_WORLD]
# callable class
class Application:
def __init__(self, environ, start_response):
pass
def __iter__(self):
yield HELLO_WORLD
# callable object
class ApplicationObj:
def __call__(self, environ, start_response):
return [HELLO_WORLD]
WSGI内容概述:服务器程序
服务器程序会在每次客户端的请求传送过来时,调用已经写好的应用程序,并将处理好的结果返回给客户端。
WSGI规定:服务器程序需要调用应用程序。
因此,服务器程序看起来大概是这样的:
def run(application):
environ = {
}
def start_response(st