简体   繁体   中英

Django Celery periodic tasks

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?

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')
}
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM