Reputation: 2022
I've created simple django project for understanding how celery periodic tasks are working. Project named 'proj' have one app (name is 'sample') and one model ('Counter'). Counter model has only one integer field name value. I am trying to increase value of counter by 1 in every minute, but can't get it work. My files:
proj/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
sample/models.py
from django.db import models
class Counter(models.Model):
value = models.IntegerField(default=0)
sample/views.py
from django.shortcuts import render
from .models import Counter
def index(request):
value = Counter.objects.get(pk=1).value
return render(request, 'sample/index.html', {'value': value})
proj/tasks.py
from celery.schedules import crontab
from proj.celery import app
from .models import Counter
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(
crontab('*', '*', '*', '*', '*'),
my_task())
@app.task
def my_task():
counter = Counter.objects.get(pk=1)
counter.value += 1
counter.save()
What am I missing?
Upvotes: 0
Views: 1265
Reputation: 3156
You have to add task and register for that in settings file.
https://medium.com/@yehandjoe/celery-4-periodic-task-in-django-9f6b5a8c21c7
CELERY_BEAT_SCHEDULE = {
'task-number-one': {
'task': 'app1.tasks.task_number_one',
'schedule': crontab(minute=59, hour=23)
},
'task-number-two': {
'task': 'app2.tasks.task_number_two',
'schedule': crontab(minute=0, hour='*/3,10-19')
}
}
Upvotes: 1