You need to enable JavaScript to run this app. Open edX Koa-1.0发送批量课程邮件时Celery报无Router属性的AttributeError
优惠活动
大模型
产品
解决方案
定价
更多

Open edX Koa-1.0发送批量课程邮件时Celery报无Router属性的AttributeError

问题根因

该报错是Celery版本与Open edX Koa-1.0不兼容导致的:

  • Open edX Koa-1.0 官方适配Celery 4.x系列,在Celery 5.0及以上版本中,原先挂载在celery根模块下的Router类被迁移到celery.app.routes模块内,不再对外暴露根级导入路径
  • 你之前执行pip重装Celery时,默认拉取了最新的高版本Celery,edx-platform内置的任务路由配置中通过字符串形式引用了celery.Router,高版本下无法找到该属性就会抛出对应错误。

无需调整celery/app/routes.py的存放位置:报错日志中涉及的文件路径完全正确,问题根源是模块导出属性变更,和文件存储路径无关。

推荐修复方案(版本对齐)
  1. 卸载当前虚拟环境中安装的高版本Celery
    执行命令:/opt/bitnami/apps/edx/venvs/edxapp/bin/pip uninstall celery -y
  2. 安装Koa版本官方兼容的Celery指定版本celery==4.4.7
    执行命令:/opt/bitnami/apps/edx/venvs/edxapp/bin/pip install celery==4.4.7
  3. 同步安装适配的kombu版本kombu==4.6.11,避免组件联动不兼容
    执行命令:/opt/bitnami/apps/edx/venvs/edxapp/bin/pip install kombu==4.6.11
  4. 重启所有Celery worker、LMS、CMS服务使依赖变更生效,再重新触发批量课程邮件任务验证。
临时兜底方案(不推荐长期使用)

如果受环境约束无法安装指定旧版Celery,可以通过修改模块导出的方式临时补全缺失的Router属性,无需改动业务路由配置:
找到edxapp虚拟环境下的celery/local.py文件,在文件末尾添加以下代码,将指定路径的Router类重新挂载到celery根模块:

from celery.app.routes import Router
original_getattr = ModuleType.__getattribute__
def patched_getattr(self, name):
    if name == "Router":
        return Router
    return original_getattr(self, name)
ModuleType.__getattribute__ = patched_getattr

注意:高版本Celery还存在多处与Koa版本edx-platform不兼容的API变更,该方案仅能绕过当前报错,长期运行会触发其他隐式异常,优先使用版本对齐的修复方案。


内容的提问来源于stack exchange,提问作者Gen Evil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 11:06:07