2017-02-14 26 views
1

我想使用celery任務創建數據庫記錄。但由於某種原因,object.save()方法不適用於task.apply_async()(應用任務asynchronousy)。而本地運行它Djando Celery: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() 

回答

0

Django的服務器()和芹菜(celery_user)任務是由不同的用戶運行,因此,celery_user尚未獲得對t的寫入權限他數據庫。那麼task.apply()運行根並且可以save()記錄和task.apply_async() - 通過celery_user並且不能。

此問題的短期解決方案是使celery_user數據庫的所有者(使用sqlite3的發展ENV):

chown celery_user:celery_user db.sqlite3 

雖然,添加組到celery_user會更適當(短期)。

或長期的 - 一切運行與非特權用戶https://www.syncano.io/blog/configuring-running-django-celery-docker-containers-pt-1/

P.S:我有一些問題http://docs.celeryproject.org/en/latest/reference/celery.contrib.rdb.html(芹菜調試工具)。每次接收任務時(即每隔30秒)Telnet都會斷開連接。確保您正在使用專用於調試的任務。

相關問題