从flask视图中推送芹菜任务分离SQLAlchemy实例(DetachedInstanceError)



我使用SQLAlchemy模型(派生自SQLAlchemy .ext.declarative.declarative_base)和Flask-SQLAlchemy

当我尝试运行任何芹菜任务(只是空)

@celery.task()
def empty_task():
    pass

common flask view

@blueprint.route(...)
def view():
   image = Image(...)
   db.session.add(image)
   db.session.flush()
   #this cause later error
   empty_task()
   #now accessing attributes ends with DetachedInstanceError
   return jsonify({'name': image.name, ...}

DetachedInstanceError: Instance <Image at 0x7f6d67e37b50> is not bound to a Session; attribute refresh operation cannot proceed

在任务推送后尝试访问模型时

。没有任务,它工作得很好。如何解决这个问题?

更新:芹菜使用这个任务库:

TaskBase = celery.Task
class ContextTask(TaskBase):
    abstract = True
    def __call__(self, *args, **kwargs):
        with app.app_context():
            try:
                return TaskBase.__call__(self, *args, **kwargs)
            except Exception:
                sentry.captureException()
                raise
celery.Task = ContextTask

啊,我在运行任务时出错了。应该是empty_task.apply_async()

直接调用它,它会创建新的应用程序上下文,新的会话导致关闭旧的。

今天我在做鼻子检查时也遇到了同样的问题。

DetachedInstanceError: Instance <EdTests at 0x1071c4790> is not bound to a Session; attribute refresh operation cannot proceed

我使用芹菜和Flask SQLAlchemy。问题发生在我更改测试设置时:

CELERY_ALWAYS_EAGER = True

我发现当同步运行芹菜任务时,db会话在任务结束时关闭。

我按照芹菜的文档用户指南解决了我的问题。芹菜建议不要启用任务的急切测试

相关内容

  • 没有找到相关文章

最新更新