2017-02-14 15 views
1

Я хочу создать записи базы данных с задачей сельдерея. Но по какой-то причине object.save() метод не работает с task.apply_async() (Примените задачи асинхронности).Djando Celery: Задача сельдерея не создает запись в DB

же запись (Ticker) сохраняется в базе данных с задачей сельдерея во время работы локально:

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() - by 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/

p.s .: у меня были некоторые проблемы с http://docs.celeryproject.org/en/latest/reference/celery.contrib.rdb.html (отладочный инструмент для сельдерея). Telnet был отключен каждый раз, когда задача была получена (т. Е. Каждые 30 секунд). Убедитесь, что вы используете задачу, предназначенную для отладки.