首页 > 解决方案 > 在不持久的任务中完成的模型更改

问题描述

我正在尝试调用异步完成的任务,因为它需要很长时间才能完成,如果我等待它完成,请求将超时(我正在对图像进行一些处理并获取结果)。当我将打印放入任务时,我看到它正在执行,所以我知道这不是问题。当我保存模型时,它的行为就像它已保存但实际上并没有永久保存它。

项目 > 项目 > settings.py

import environ
env = environ.Env()
CELERY_BROKER_URL = env.str('BROKER_URL', 'amqp://qisdvxct:b0iKxulu3z2evLScg1hnCNfWflDEBBm2@lion.rmq.cloudamqp.com/qisdvxct')
CELERY_RESULT_BACKEND = 'django-db'

INSTALLED_APPS = [
    ...
    'django_celery_results',

]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

MEDIA_URL = '%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME

DEFAULT_FILE_STORAGE = 'accounting.s3utils.MediaRootS3BotoStorage'

MEDIA_ROOT = MEDIA_URL
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

项目>项目>初始化.py

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ('celery_app',)

项目 > 项目 > celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'accounting.settings')

app = Celery('accounting')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

项目>项目>任务.py

from __future__ import absolute_import, unicode_literals
from quickstart.models import Receipt
from celery import shared_task


@shared_task
def set_something(receipt_id):
    print("doing something")
    receipt = Receipt.objects.get(id=receipt_id)

    receipt.text= "some text"
    receipt.save()
    return True

查看日志,在任务中调用 save() 之后,该字段似乎确实发生了变化(即使我再次 Receipt.objects.get 并检查该字段),但是如果我进入 Django 管理面板,更改是没有反映在那里。

为什么保存实际上没有保存到数据库?

标签: pythondjangocelery

解决方案


推荐阅读