【问题标题】:How to keep a request context in a celery task, in Python Flask?如何在 Python Flask 中将请求上下文保存在 celery 任务中?
【发布时间】:2026-02-08 01:40:01
【问题描述】:

有没有办法将请求复制到 Flask 中的 celery 任务,以使任务在启动任务的请求上下文中执行?
我需要在 celery 任务中访问烧瓶安全当前用户,但由于该任务在请求上下文之外,我不能这样做。我需要请求中的其他信息,因此仅将当前用户转发到该任务是行不通的。

我的任务在数据库中插入。它需要当前用户保存创建行的用户的 id。将用户对象传递给任务将解决问题。但是,应用程序逻辑是这样的,每次插入/删除/更新都通过刷新事件之前记录,该事件记录进行修改的用户、他的 IP、原始 url、它插入的数据......)

日志事件就像我在刷新之前所说的那样完成,它适用于 99% 的场景。 但是当我有一个我想成为芹菜任务的冗长任务时,请求 数据不可用,当前用户也不可用(因为它在原始请求上下文之外)

【问题讨论】:

  • 你找到答案了吗?

标签: python flask celery


【解决方案1】:

将 request 或 current_user 对象传递给 celery 任务并不是开箱即用的方法,因为它们是不可序列化的。但是人们已经通过创建一个包装器在请求上下文中调用 celery 任务来解决这个问题。

Celery task in a Flask request context 博客文章详细探讨了该主题。 Xion 的要点和 aviaryan 使用请求上下文包装器派生的要点。

【讨论】:

  • 这在 Celery 4 中不起作用。有没有新的方法可以做到这一点?