python - 在不持久的任务中完成的模型更改
问题描述
我正在尝试调用异步完成的任务,因为它需要很长时间才能完成,如果我等待它完成,请求将超时(我正在对图像进行一些处理并获取结果)。当我将打印放入任务时,我看到它正在执行,所以我知道这不是问题。当我保存模型时,它的行为就像它已保存但实际上并没有永久保存它。
项目 > 项目 > 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 管理面板,更改是没有反映在那里。
为什么保存实际上没有保存到数据库?
解决方案
推荐阅读
- python - Altair 限制构面图中的条形图数量
- r - 在 R 中导出图像:Cairo 和 ggsave 增加指定尺寸
- javascript - Jest & Node:MongoError:池正在耗尽,禁止新操作
- javascript - 提交前使用jquery更改隐藏字段值
- python - Keras 中的不对称指标
- python - 在 Docker 中运行 Python 代码会给出:“/usr/bin/python3: can't find '__main__' module in 'test.py'”
- redirect - 301 重定向仅在刷新或新窗口上单击时不起作用
- c++ - 访问位于基向量中的子对象的成员
- javascript - (discord.js) 检查机器人是否有权限不起作用
- django - Wagtail Draftail 编辑器删除重叠或复合 HTML 标记边界处的空白