WSGI
什么是WSGI?
wsgi 是一个 web 组件的接口规范(WSGI is the Web Server Gateway Interface. It is a specification that describes how a web server communicates with web applications, and how web applications can be chained together to process one request.),wsgi将 web 组件分为三类: web服务器,(web中间件),web应用程序
wsgi server
基本工作流程
1. 服务器创建socket,监听端口,等待客户端连接。
2. 当有请求来时,服务器解析客户端信息放到环境变量environ中,并调用绑定的handler来处理请求。
3. handler解析这个http请求,将请求信息例如method,path等放到environ中。
4. wsgi handler再将一些服务器端信息也放到environ中,最后服务器信息,客户端信息,本次请求信息全部都保存到了环境变量environ中。
5. wsgi handler 调用注册的wsgi app,并将environ和回调函数传给wsgi app
6. wsgi app 将reponse header/status/body 回传给wsgi handler
7. 最终handler还是通过socket将response信息塞回给客户端
wsgi application
wsgi application就是一个普通的可调用的对象,当有请求到来时,wsgi server会调用这个wsgi app。这个对象接收两个参数,通常为environ,start_response。environ就像前面介绍的,可以理解为环境变量,跟一次请求相关的所有信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息。start_response是一个callback函数,wsgi application通过调用start_response,将response headers/status 返回给wsgi server。此外这个wsgi app会return 一个iterator对象 ,这个iterator就是response body。
WSGI规定:
1. 应用程序需要是一个可调用的对象
可以是函数
可以是一个实例,它的类实现了__call__方法
可以是一个类,这时候,用这个类生成实例的过程就相当于调用这个类
2. 可调用对象接收两个参数
这样,如果这个对象是函数的话,它看起来要是这个样子:
# callable function def application(environ, start_response): pass
如果这个对象是一个类的话,它看起来是这个样子:
# callable class class Application: def __init__(self, environ, start_response): pass
如果这个对象是一个类的实例,那么,这个类看起来是这个样子:
# callable object class ApplicationObj: def __call__(self, environ, start_response): pass
3.可调用对象要返回一个值,这个值是可迭代的。