python - Django celery : Celery task does not create record in DB

标签 python django-models celery

我想用 celery 任务创建数据库记录。但由于某种原因 object.save() 方法无法与 task.apply_async() (异步应用任务)一起使用。

在本地运行时,相同的记录(Ticker)会通过 celery 任务保存在数据库中:

get_all_tickers.apply()

但不是以异步方式保存:

get_all_tickers.apply_async()

在这两种情况下,INSERT 语句都在服务器日志中可见。

models.py

class Ticker(TimeStampedModel):
    ask = models.DecimalField(max_digits=18, decimal_places=8)
    bid = models.DecimalField(max_digits=18, decimal_places=8)
    pair = models.ForeignKey(Pair)

tasks.py

from celery import shared_task
...
@shared_task()
def get_all_tickers():
    pair = Pair.objects.last()
    ticker = Ticker(ask=Decimal(1.0), bid=Decimal(1.0), pair=pair)
    ticker.save()

最佳答案

Django 服务器(root)和 celery(celery_user)任务由不同的用户运行,因此,celery_user 没有写入权限数据库。那么 task.apply()root 运行,并且可以 save() 记录和 task.apply_async() - 由 celery_user 提供,但不能。

此问题的短期解决方案是让 celery_user 成为数据库的所有者(使用 sqlite3 的开发环境):

chown celery_user:celery_user db.sqlite3

不过,向 celery_user 添加一个组会更合适(短期)。

或者长期 - 使用非特权用户运行所有内容 https://www.syncano.io/blog/configuring-running-django-celery-docker-containers-pt-1/

附注:我在使用 http://docs.celeryproject.org/en/latest/reference/celery.contrib.rdb.html 时遇到了一些问题(celery的调试工具)。每次收到任务时(即每 30 秒),Telnet 就会断开连接。确保您正在使用专用于调试的任务。

关于python - Django celery : Celery task does not create record in DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42224076/

相关文章:

python - celery 不运行和弦回调

Python pandas str. 从不干净的列中提取年份信息

python - 如何用分号后没有指定秒数的 Z 字母解析日期时间

sql - django 模型中的不同元素

python - 为什么我不能访问 Meta 类作为 Django 模型类的属性?

django - celery django守护程序上有多个 worker 和多个队列

python - 使用 Mandrill send_at 或 Celery countdown/eta 延迟发送电子邮件

Python 重复循环文件以将记录与用户输入进行匹配

python - 使用 Pandas 数据框不相交组进行随机抽样

django - 如何在表单验证错误 Django 上预填充图像字段?