集成Celery时Redis报错:Connection.__init__()收到意外参数'username'
解决Celery连接Redis时的TypeError: Connection.init() got an unexpected keyword argument 'username'
解决方案
1. 升级redis-py版本
执行以下命令升级到支持username参数的redis-py版本:
pip install --upgrade redis>=3.5.0
redis-py从3.5.0版本开始,Connection类新增了username参数支持,可兼容Kombu自动传递的参数(即使你未配置用户名,Kombu也会默认传None)。
2. 降级Kombu版本(适配旧版redis)
若无法升级redis,可降级Kombu到不会自动传递username参数的版本:
pip install kombu<5.2.0
Celery 5.1.x配合过高版本的Kombu时,会引入username参数传递逻辑,降级后可避免该问题。
3. 显式指定空用户名(可选)
修改Celery配置中的Redis URL,显式添加空用户名:
CELERY_BROKER_URL = "redis://:@0.0.0.0:6379" CELERY_RESULT_BACKEND = "redis://:@0.0.0.0:6379"
部分Kombu版本会识别到空用户名,不再额外传递username参数。
问题根源
你未配置Redis用户名,但Celery依赖的Kombu库在处理Redis连接时,会自动向redis-py的Connection类传递username参数(默认值为None)。而你当前环境的redis-py版本低于3.5.0,该版本的Connection类并未实现username初始化参数,因此触发TypeError。
从错误栈可见,错误发生在redis/connection.py的make_connection方法中,代码尝试传递username参数给Connection构造函数,但旧版本不支持该参数。
验证当前redis版本
可执行以下命令确认redis-py版本:
pip show redis
内容的提问来源于stack exchange,提问作者naveen Satyarthi
相关产品推荐
相关产品推荐

