使用aiohttp框架的Python API生产环境出现AssertionError求助
问题排查与解决方案
这个AssertionError是因为aiohttp在创建请求对象时,断言transport不为空失败,通常发生在客户端/反向代理提前断开连接,而旧版本aiohttp未妥善处理该场景导致的。结合你的运行环境,给出以下解决步骤:
升级aiohttp到最新稳定版
你当前使用的3.8.5版本存在连接处理相关的已知问题,3.9及以上版本修复了这类连接提前断开时的断言触发问题。执行升级命令:pip install --upgrade aiohttp临时禁用断言(应急方案)
如果暂时无法升级,可通过设置环境变量禁用Python断言,避免错误抛出:
在Railway.app的服务环境变量中添加PYTHONOPTIMIZE=1,这会让Python跳过所有断言检查,即使transport为空也不会触发错误,aiohttp会自动处理断开的连接。调整aiohttp服务器超时配置
启动aiohttp服务器时配置合理的超时参数,避免连接闲置过久被Railway的负载均衡断开:from aiohttp import web app = web.Application() # 配置路由等逻辑... if __name__ == "__main__": web.run_app( app, socket_timeout=30, # 套接字超时时间 keepalive_timeout=75 # 长连接超时时间 )检查数据库连接池配置
长期保持Firestore和MongoDB的活跃连接可能占用系统资源,间接影响请求处理。确保数据库连接池的最大连接数设置合理,避免耗尽文件描述符或内存:- 对于MongoDB(motor异步驱动),调整
maxPoolSize参数 - 对于Firestore,检查客户端的连接复用配置,避免不必要的长连接
- 对于MongoDB(motor异步驱动),调整
报错信息:
Task exception was never retrieved future: <Task finished name='Task-37026' coro=<RequestHandler.start() done, defined at /opt/venv/lib/python3.8/site-packages/aiohttp/web_protocol.py:462> exception=AssertionError()> Traceback (most recent call last): File "/opt/venv/lib/python3.8/site-packages/aiohttp/web_protocol.py", line 505, in start request = self._request_factory(message, payload, self, writer, handler) File "/opt/venv/lib/python3.8/site-packages/aiohttp/web_app.py", line 446, in _make_request return _cls( File "/opt/venv/lib/python3.8/site-packages/aiohttp/web_request.py", line 811, in __init__ super().__init__(*args, **kwargs) File "/opt/venv/lib/python3.8/site-packages/aiohttp/web_request.py", line 188, in __init__ assert transport is not None AssertionError
内容的提问来源于stack exchange,提问作者Ayush Agnihotri
相关产品推荐
相关产品推荐

