如何在每个月末运行Celery Periodic任务

时间:2017-12-06 19:03:09

标签: python django django-celery periodic-task

基本上,我有生成发票的任务。所以我在 tasks.py 文件中创建了一个函数generate_invoice()

现在,我正在使用@periodic_task来调用该函数。但我需要我的任务只在本月的最后一天在晚上11:55到晚上11:57之间运行

我使用此功能获得月份的最后一个日期:

def get_last_date():
        today = timezone.now()
        year = today.year
        month = today.month
        last_date = calendar.monthrange(year, month)[1]
        return str(last_date)

任务的代码如下所示:

@periodic_task(run_every=(crontab(day_of_month=get_last_date())), name="invoice_simulation", ignore_result=True)
def invoice_simulation():
    generate_invoice()

但这不起作用!

或者有没有更好的方法来实现此功能,请建议。

2 个答案:

答案 0 :(得分:1)

一个相当简单的解决方案是每天晚上11:55运行计划,并检查任务内部,如果今天是该月的最后一天。如果是,请生成发票。如果没有那么就什么都不做。

类似的东西:

@periodic_task(run_every=(crontab(hour=23, minute=55)), name="invoice_simulation", ignore_result=True)
def invoice_simulation():
    if timezone.now().day == get_last_date():
        generate_invoice()

确保timezonecrontab互不冲突。两者都必须是TZ识别(或UTC),或者两者都使用天真时间。

答案 1 :(得分:0)

更新你的get_last_date()函数,如下所示。

def get_last_date():
    today = datetime.date.today()
    year = today.year
    month = today.month
    last_date = calendar.monthrange(year, month)
    return str(last_date)