在python asyncio 库中可以创建 server 和 connection, 想要使用 asyncio 创建 server服务器的话需要一个 protocol 协议对象处理请求服务, 在asyncio 中,server 底层是tcp server, 想要实现web server 就需要实现 protocol协议,用自定义的protocol 来处理解析请求数据
protocol
在asyncio中定义了server 请求进来的处理协议, 常用的有:
# 创建http协议处理对想
class HttpProtocol(asyncio.Protocol):
"""
asyncio 异步io协议 方法执行顺序:
connection_made -> data_received -> eof_received -> connection_lost
"""
def __init__(self, loop: asyncio.get_event_loop(), server):
self.loop = loop
self.transport = None
self.server = server
def connection_made(self, transport):
"""
连接建立时会调用的方法,
:param transport transport可以理解为是一个 上下文,transport 对象中包含了客户端的请求信息
"""
self.transport = transport # 将上下文对象保存到对象属性中
def data_received(self, data):
"""
当创建完连接,执行完connection_made初始化的时候,会调用这个方法,将请求的数据传递到这里,
在这里可以处理解析请求协议、路由、数据,
:param data 就是请求的数据(二进制)
"""
# 关于uWSGI和sanic 部署个人理解:
# sanic 部署到生产环境上可以直接 用 python 直接启动程序, 不需要uWSGI, 而 flask django
# 则不行, 个人理解是 sanic 使用 httptools 来处理解析请求,
# httptools 用c 来写的,运行起来比python自己写的解析要快,
# 而flask django 框架自带的处理解析请求是用python 写的,性能没那么高,
# 而且 uWSGI 中还包含了守护进程、进程管理等功能
pass
def eof_received(self):
"""
有些请求是通过eof描述符来代表结束的, 遇到这种协议的请求时,会调用这个方法
:return None:
"""
pass
def connection_lost(self, exc):
"""
请求结束收尾工作,不管有没有异常都会执行到
:param exc: 参数 exc 是异常信息, 如果没有异常,exc 参数就是None
:return:
"""
pass
transport
transport 个人理解就是一个请求上下文,transport 对象中包含了这个请求的请求信息
实现类似 sanic 的异步web 框架
通过asyncIo create_server + 自定义 protocol 来实现一个类似 sanic、flask的mini_web 框架,
项目地址:mini_web.