赞
踩
在python asyncio 库中可以创建 server 和 connection, 想要使用 asyncio 创建 server服务器的话需要一个 protocol 协议对象处理请求服务, 在asyncio 中,server 底层是tcp server, 想要实现web server 就需要实现 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 对象中包含了这个请求的请求信息
通过asyncIo create_server + 自定义 protocol 来实现一个类似 sanic、flask的mini_web 框架,
项目地址:mini_web.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。