基本上,我有生成发票的任务。所以我在 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()
但这不起作用!
或者有没有更好的方法来实现此功能,请建议。
答案 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()
确保timezone
和crontab
互不冲突。两者都必须是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)