2015-08-26 5 views
0
# In tasks.py file 
from __future__ import absolute_import 

from celery import shared_task 

@shared_task 
def randadd(x): 
    y = randint(0,9) 
    return x + y 

# In views.py 
    context = { 
     'add': tasks.randadd(5) 
    } 
def home(request): 
    global context 
    return render(request, "home.html", context) 

# In home.html 
<h1>{{ add }}</h1> 

В home.html Я вижу результат 5 + (случайный int). Как бы я пересчитал результат для добавления, чтобы его значение обновлялось каждые 30 минут?Как периодически планировать задание django celery

Я смог найти этот источник: http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html, но я все еще смущен тем, как его использовать.

+0

Вы здесь, на ярмарке. Во-первых, вместо того, чтобы возвращать значение из randadd, вы должны где-то хранить в хранилище данных. Затем ваше представление должно загрузить это значение, чтобы отобразить его. Beat - встроенный инструмент Celery для регулярного запуска задач. – GavinH

+0

Вижу, вы можете показать мне, как или предложить ссылку? – PiccolMan

ответ

4

Вот реализация оболочки с использованием Redis в качестве хранилища данных. Предполагается, что Redis установлен и запущен на локальном компьютере с настройками по умолчанию.

# tasks.py 
import redis 
from celery import shared_task 

@shared_task 
def update_number(): 
    r = redis.StrictRedis() 
    r.set('my_number', randint(0,9)) 


# views.py 
import redis 

def home(request): 
    r = redis.StrictRedis() 
    context = { 
     'add': r.get('my_number') 
    } 
    return render(request, 'home.html', context) 


# settings.py 
from celery.schedules import crontab 

CELERYBEAT_SCHEDULE = { 
    'context': { 
     'task': 'tasks.update_number', 
     'schedule': crontab(minute=30), 
    } 
} 

Обязательно проверьте сельдерей документы на следующие:

  • Настройки очереди сообщений (Redis может быть использован в качестве очереди сообщений)
  • Run сельдерея рабочего
  • Выполнить Пример использования сельдерея:
+0

Есть ли эквивалентный способ хранения данных с помощью rabbitmq? Например, вы использовали redis.StrictRedis() для хранения randint (0,9) в 'my_number'. – PiccolMan

+1

Нет, RabbitMQ не предлагает хранения. Альтернативой использованию Redis будет база данных, такая как PostgreSQL. В мире Django вы создадите модель для чтения и записи в базу данных. – GavinH

+0

Спасибо за помощь. Благодаря мне я смог решить свою проблему. – PiccolMan

0

На основе документации вы ссылочных, это выглядит, как это один из способов:

from celery.schedules import crontab 

CELERYBEAT_SCHEDULE = { 
    'context': { 
     'task': 'randadd', 
     'schedule': crontab(minute=30), 
     'args': 5 
     # or if that doesn't work try: 
     #'args':(5) 
    }, 
} 

И это еще одна:

from datetime import timedelta 

CELERYBEAT_SCHEDULE = { 
    'context': { 
     'task': 'tasks.add', 
     'schedule': timedelta(minutes=30), 
     'args': 5 
     #but the last line still might be: 
     #'args':(5) 
    }, 
} 
+0

Я пробовал это, но он не работает. Я думаю, что документ, на который я ссылался, просто вызывает функцию каждые 30 секунд, но я хочу, чтобы данные, хранящиеся в «добавлении», обновлялись периодически. – PiccolMan

Смежные вопросы