【问题标题】:Django Celery periodic tasksDjango Celery 周期性任务
【发布时间】:2018-11-28 07:13:06
【问题描述】:

我创建了一个简单的 django 项目来了解 celery 周期性任务是如何工作的。名为“proj”的项目有一个应用程序(名称为“sample”)和一个模型(“Counter”)。计数器模型只有一个整数字段名称值。我试图每分钟将计数器的值增加 1,但无法使其工作。我的文件:

项目/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()

示例/models.py

from django.db import models


class Counter(models.Model):
    value = models.IntegerField(default=0)

示例/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()

我错过了什么?

【问题讨论】:

    标签: python django celery periodic-task


    【解决方案1】:

    您必须在设置文件中添加任务并注册。

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

    【讨论】:

    • 我不需要 tasks.py 中的“setup_periodic_tasks”吗?
    • 你可以使用周期性任务装饰器,然后你不需要在设置文件中设置。