数据库没有被在 celery beat 中运行的任务更新

问题描述

您好,我有一个 celery 任务,假设每 1 小时运行一次以获取密钥,它运行时甚至表现得好像更新了数据库,但实际上并没有更新

@app.task
def refresh_token():
    r = requests.get(AUTH_URL,auth=HTTPBasicAuth(CONSUMER_KEY,CONSUMER_SECRET))
    obj = json.loads(r.text)
    obj['expires_in'] = int(obj['expires_in'])
    try:
        mpesa_token = mpesaAccesstoken.objects.get(id=1)
        mpesa_token.access_token = obj['access_token']
        mpesa_token.save()
        print(obj)
        print(mpesa_token.access_token)
        print("saved")
    except:
        print(obj)
        mpesa_token = mpesaAccesstoken.objects.create(**obj)

    return 1

最后你打印日志中的所有显示,但检查管理面板,但当我使用视图并发出请求然后调用函数时,这些值没有更新,数据库得到更新,任何人都知道发生了什么

解决方法

您需要将 transaction.atomic() 添加到您的代码中。像这样:

from django.db import transaction

@app.task
def refresh_token():
    with transaction.atomic():
        r = requests.get(AUTH_URL,auth=HTTPBasicAuth(CONSUMER_KEY,CONSUMER_SECRET))
        obj = json.loads(r.text)
        obj['expires_in'] = int(obj['expires_in'])
        try:
            mpesa_token = MpesaAccessToken.objects.get(id=1)
            mpesa_token.access_token = obj['access_token']
            mpesa_token.save()
            print(obj)
            print(mpesa_token.access_token)
            print("saved")
        except:
            print(obj)
            mpesa_token = MpesaAccessToken.objects.create(**obj)
    
        return 1

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...