如何解决Flask应用中的Heroku Redis RQ错误?
解决Flask + RQ Redis队列调用错误的方案
错误核心原因
你的代码存在两个关键问题:
- 调用
q.enqueue()时,错误传入函数执行结果(createtable.test_task())而非函数对象本身。RQ需要接收函数引用才能异步调度任务,直接执行函数会把返回值传给队列,若返回值是字典这类带{的结构,就会触发Invalid attribute name: {的解析错误。 - Flask路由直接返回RQ的
Job对象,不符合Flask路由的返回规则(需返回字符串、响应对象等可序列化内容)。
修正步骤
调整队列任务调用方式
将q.enqueue(createtable.test_task(),'http://heroku.com')改为q.enqueue(createtable.test_task, 'http://heroku.com')——去掉函数后的括号,传递函数本身,任务参数放在函数名之后。修改路由返回内容
不能直接返回Job对象,可返回任务ID或状态提示,方便后续查询任务执行结果。确保任务函数可被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
相关产品推荐
相关产品推荐

