You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Flask应用中的Heroku Redis RQ错误?

解决Flask + RQ Redis队列调用错误的方案

错误核心原因

你的代码存在两个关键问题:

  • 调用q.enqueue()时,错误传入函数执行结果(createtable.test_task())而非函数对象本身。RQ需要接收函数引用才能异步调度任务,直接执行函数会把返回值传给队列,若返回值是字典这类带{的结构,就会触发Invalid attribute name: {的解析错误。
  • Flask路由直接返回RQ的Job对象,不符合Flask路由的返回规则(需返回字符串、响应对象等可序列化内容)。

修正步骤

  1. 调整队列任务调用方式
    将q.enqueue(createtable.test_task(),'http://heroku.com')改为q.enqueue(createtable.test_task, 'http://heroku.com')——去掉函数后的括号,传递函数本身,任务参数放在函数名之后。

  2. 修改路由返回内容
    不能直接返回Job对象,可返回任务ID或状态提示,方便后续查询任务执行结果。

  3. 确保任务函数可被Worker正常导入
    确认createtable.py与Flask主文件、worker.py在同一目录,且test_task函数定义正确(需匹配传入的参数数量)。

修正后代码示例

Flask主文件(app.py)

from worker import conn
from rq import Queue

q = Queue(connection=conn)

@app.route('/pureredis', methods=['POST', 'GET'])
def pureredis():
    import createtable
    # 传递函数对象,而非执行结果
    job = q.enqueue(createtable.test_task, 'http://heroku.com')
    # 返回任务ID和提示信息
    return f"任务已提交,任务ID:{job.id}"

createtable.py示例

def test_task(url):
    # 在这里编写具体任务逻辑
    print(f"开始处理URL:{url}")
    return f"URL处理完成:{url}"

额外检查项

  • 确保Heroku上的Worker进程已启动,可通过Heroku CLI执行heroku ps:scale worker=1启动Worker。
  • 确认worker.py中的Redis连接配置与Heroku Redis实例信息匹配。

内容的提问来源于stack exchange,提问作者James Manfield

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:50:26