根据用户给定的时间周期性地做一个任务运行

Make a task run periodically with time given by user

我必须构建一个 Django 应用程序,以向用户发送电子邮件通知。但是用户想要设置发送电子邮件的时间段。我读到 celery 有一个周期性任务功能,但是时间必须事先设置,那么我怎么能用用户给定的时间用 celery 做一个周期性任务呢?

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

时间设置为获取用户在表单中 post 时给出的时间。

使用线程。 您可以在 https://docs.python.org/3/library/threading.html

获取更多详细信息

我认为 this 这篇文章可以帮助您。

另一种选择是设计一个周期性任务 运行 每 1 分钟一次,它将查询 UserMail 以检查某些记录是否在一分钟内确实有 time_set 并发送电子邮件。 另请注意,celery 中的周期性任务调度程序并非设计用于处理数千个计划任务。

所以基本上你想用用户输入的时间创建任务。 O 拥有的是 API,我以 POST 请求的形式接受用户的输入。

在这里,我将用户发送的数据保存在一个名为response 的变量中。 然后,我们用用户给定的时间(以分钟为单位)创建一个时间表。 最后我们制作所需的周期性任务。在您的情况下,如果您的应用程序名为 resources 的 tasks.py 文件中有一个名为 send_mail 的函数,代码将如下所示。

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