#python #django #django-templates #cron #celery
Вопрос:
Я использую Сельдерей для своего проекта Django и запланировал несколько задач crontab для отправки электронных писем пользователям в определенное время. Мне нужно вывести расписание в шаблоне HTML/Django, в котором указаны даты, на которые пользователи могут ожидать отправки электронных писем. Мое расписание кронтаба выглядит так для сельдерея:
import os
from celery import Celery
from celery.schedules import crontab
app = Celery("myapp")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print("Request: {0!r}".format(self.request))
first_monday_april_to_july = crontab(
minute=15, hour=6, day_of_week="monday", day_of_month="1-7", month_of_year="4,5,6,7"
)
august_every_monday_first_two_weeks = crontab(
minute=15, hour=6, day_of_week="monday", day_of_month="1-14", month_of_year="8"
)
august_weekdays_second_two_weeks = crontab(
minute=15, hour=6, day_of_week="mon-fri", day_of_month="15-31", month_of_year="8"
)
app.conf.beat_schedule = {
"report1": {
"task": "email_report",
"schedule": first_monday_april_to_july,
},
"report2": {
"task": "email_report",
"schedule": august_every_monday_first_two_weeks,
},
"report3": {
"task": "email_report",
"schedule": august_weekdays_second_two_weeks,
}
Я надеялся, что смогу захватить все даты, на которые будут отправлены электронные письма из этих задач, и сохранить их в списке в представлении, а затем отправить его в шаблон, который будет отображаться в таблице. Возможно ли что-то подобное? Пока мне не удается найти способ сделать это.
Комментарии:
1. Вы имеете в виду, что вам нужно рассчитать, какой будет следующая дата исполнения?
2. возможно, этот пакет может вам помочь.
PeriodicTask
модель задач, определенная в этом приложении django, содержит информацию о периодических задачах с сельдереем. Вы можете передать набор запросов этой модели в контекст и использовать в шаблоне.3. @VictorErmakov Да, для этого нужно было бы показать все даты выполнения задач.
4. Я думаю, что вам нужно получить этот пакет github.com/kiorky/croniter
Ответ №1:
В итоге я создал функцию для извлечения всех дат из задач, а затем добавил их все в список расписания, а затем передал его через представление в шаблон для вывода в таблицу. Это выглядит так:
from datetime import date, datetime, timedelta
from .celery import (
first_monday_april_to_july,
august_every_monday_first_two_weeks,
august_weekdays_second_two_weeks,
)
def get_schedule_due_dates(schedule, last_date=datetime.now().date().replace(month=12, day=31)):
start_date = datetime.now()
end_date = datetime.combine(last_date, datetime.max.time())
schedules = []
while start_date <= end_date:
next_due_schedule = schedule.remaining_estimate(start_date)
due_date = datetime.now() next_due_schedule
if due_date <= end_date:
schedules.append(due_date)
else:
break
start_date = due_date timedelta(days=1)
return schedules
def report_schedule(request):
schedules = []
schedules.extend(get_schedule_due_dates(first_monday_april_to_july))
schedules.extend(get_schedule_due_dates(august_every_monday_first_two_weeks))
schedules.extend(get_schedule_due_dates(august_weekdays_second_two_weeks))
return render(
request,
"reports/report_schedule.html",
{"schedules": sorted(schedules)},
)