WSGI模型
WSGI(Web Server Gateway Interface) 主要规定了服务器端和应用程序间的接口。
解决服务与程序之间的交互。
分析
1、浏览器将HTTP请求发送给WSGI Server
2、由WSGI Server将请求解包、封装成environ
3、将封装好的environ和start_response函数,传递给WSGI APP逻辑处理
4、App返回的一个可迭代对象,可以被认作正文,后期经处理变成HTTP正文
5、WSGI Server接收start_response函数和App返回正文,并作为HTTP报文头、HTTP正文发送回游览器
WSGI服务器–wsgiref
wsgiref是Python提供的一个WSGI参考实现库,不适合生产环境
wsgiref.simple_server模块实现了一个简单的WSGI HTTP服务器
import wsgiref
from wsgiref.simple_server import make_server
def demo_app(environ,start_response):
from io import StringIO
# 内存虚拟文件
stdout = StringIO()
#写入文件
print("Hello world!", file=stdout)
print(file=stdout)
h = sorted(environ.items())
for k,v in h:
print(k,'=',repr(v), file=stdout)
start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')])
return [stdout.getvalue().encode("utf-8")]
ws=make_server('127.0.0.1',9999,demo_app)
ws.serve_forever()
from wsgiref.simple_server import make_server
from wsgiref.simple_server import demo_app
# demo_app应用程序,可调用
ws=make_server('127.0.0.1',9999,demo_app)
ws.serve_forever()#server.handle_request()执行一次
WSGI服务器作用:
- 监听HTTP服务端口(TCPServer,默认端口80)
- 接收浏览器端的HTTP请求并解析封装成environ环境数据
- 负责调用应用程序,将environ数据和start_response方法两个实参传入给Application
- 将应用程序响应的正文封装成HTTP响应报文返回游览器端
WSGI APP应用程序端
1、应用程序应该是一个可调用对象,Python中应该是函数、类、实现了__call__方法的类的实例
2、可调用对象接收2个参数
from wsgiref.simple_server import make_server
sample=b'123456'
def app(environ,start_response):
start_response('200 ok', [('Content-Type', 'text/plain; charset=utf-8')])
return [sample]
class App:
def __init__(self,environ,start_response):
self.en=environ
self.start=start_response
def __iter__(self):
self.start('200 ok', [('Content-Type', 'text/plain; charset=utf-8')])
yield sample
class Application:
def __call__(self, environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain; charset=utf-8')])
return [sample]
ws=make_server('127.0.0.1',9999,App)
ws.serve_forever()#server.handle_request()执行一次
environ
environ是包含Http请求信息的dict字典对象
名称 | 含义 |
---|---|
REQUEST_METHOD | 请求方法,GET、POST等 |
PATH_INFO | URL中的路径部分 |
QUERY_STRING | 查询字符串 |
SERVER_NAME,SERVER_PORT | 服务器名、端口 |
HTTP_HOST | 地址和端口 |
SERVER_PROTOCOL | 协议 |
HTTP_USER_AGENT | UserAgent信息 |
start_response
start_response(status, response_headers, exc_info=None)
start_response应该在返回可迭代对象之前调用,因为它返回的是Response Header。返回的可迭代对象是
Response Body。
WSGI WEB服务器
- 本质上就是一个TCP服务器,监听在特定端口上
- 支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器端
- 实现了WSGI协议,该协议约定了和应用程序之间接口(参看PEP333,https://www.python.org/dev/peps/p
ep-0333/)
WSGI APP应用程序 - 遵从WSGI协议
- 本身是一个可调用对象
- 调用start_response,返回响应头部
- 返回包含正文的可迭代对象
WSGI 框架库往往可以看做增强的更加复杂的Application。