Выполнять задачу периодически со временем, указанным пользователем - PullRequest
0 голосов
/ 18 марта 2020

Мне нужно создать приложение Django, чтобы отправлять пользователю уведомления по электронной почте. Но пользователь хочет установить период времени, в который отправляется его электронное письмо. Я читал, что у сельдерея есть задача periodi c, но время должно быть установлено заранее, так как я могу сделать задачу periodi c со временем, заданным пользователем, с сельдереем?

class UserMail(models.Model):
    user_mail = models.EmailField()
    auto_send_mail = models.BooleanField(default=False)
    time_set = models.TimeField(blank=True,null=True)

Время, установленное для получения времени, указанного пользователем при публикации в форме.

Ответы [ 3 ]

0 голосов
/ 18 марта 2020

Я думаю, эта статья может помочь с тем, что вам нужно.

Другой вариант - вместо этого создать периодическую c задачу, выполняемую каждую 1 минуту, которая будет запрашивать UserMail для проверьте, есть ли в некоторых записях time_set в течение минуты и отправьте электронные письма. Также обратите внимание, что планировщик periodi c tasks в сельдерее не предназначен для обработки тысяч запланированных задач.

0 голосов
/ 18 марта 2020

Итак, в основном вы хотите создать задание со временем, введенным пользователем. У нас есть API, и я принимаю данные от пользователя в форме запроса POST.

Здесь я скопировал данные, отправленные пользователем, в переменную с именем response. Затем мы создаем расписание со временем, указанным пользователем в минутах. и, наконец, мы делаем требуемую задачу periodi c. В вашем случае, если у вас есть функция send_mail в файле tasks.py в вашем приложении с именем resources, код будет выглядеть следующим образом.

response = request.data.copy()

schedule, created = IntervalSchedule.objects.get_or_create(
    every=response['interval'],
    period=IntervalSchedule.MINUTES,
)

task = PeriodicTask.objects.create(
    interval=schedule,
    name=f'{send mail task for user {self.request.user.id}| '
    task='urlmonitor.tasks.send_mail',
    args=json.dumps([self.request.user.email]),
    # expires=datetime.utcnow() + timedelta(seconds=30)
)
0 голосов
/ 18 марта 2020

Используйте многопоточность. Вы можете получить более подробную информацию на https://docs.python.org/3/library/threading.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...