[英]Database is not updated in Celery task with Flask and SQLAlchemy
我正在用Flask和SQLAlchemy編寫Web應用程序。 我的程序需要在后台處理一些東西,然后將此東西標記為在數據庫中已處理。 使用標准的Flask / Celery示例 ,我有類似以下內容:
from flask import Flask
from celery import Celery
def make_celery(app):
celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
app = Flask(__name__)
celery = make_celery(app)
class Stuff(db.Model):
id = db.Column(db.Integer, primary_key=True)
processed = db.Column(db.Boolean)
@celery.task()
def process_stuff(stuff):
# process stuff here
stuff.processed = True
db.session.commit()
@app.route("/process_stuff/<id>")
def do_process_stuff(id):
stuff = Stuff.query.get_or_404(id)
process_stuff.delay(stuff)
return redirect(url_for("now_wait"))
我可以從process_stuff
訪問我的數據庫(例如,提交諸如Stuff.query.get(some_id)
工作之類的查詢),但是db.session.commit()
無濟於事:我的stuff
記錄未更新。 根據Celery worker日志,提交已發生,但數據庫中沒有任何更改。 我的db.session.commit()
嗎? 是否可以以某種方式做出這樣的提交?
知道了 傳遞給process_stuff()
stuff
未附加到db.session
。 我必須在process_stuff()
進行顯式請求,以獲得正確的stuff
對象,如下所示:
@celery.task()
def process_stuff(stuff):
# process stuff here
my_stuff = Stuff.query.get(stuff.id)
my_stuff.processed = True
db.session.commit()
現在可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.