Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 让任务在用户指定的时间内定期运行_Python_Django_Celery - Fatal编程技术网

Python 让任务在用户指定的时间内定期运行

Python 让任务在用户指定的时间内定期运行,python,django,celery,Python,Django,Celery,我必须构建一个Django应用程序,向用户发送电子邮件通知。但是用户希望设置发送电子邮件的时间段。我读到芹菜有一个周期性任务功能,但是时间必须事先设置好,那么我如何用芹菜制作一个由用户给定时间的周期性任务呢 class UserMail(models.Model): user_mail = models.EmailField() auto_send_mail = models.BooleanField(default=False) time_set = models.Ti

我必须构建一个Django应用程序,向用户发送电子邮件通知。但是用户希望设置发送电子邮件的时间段。我读到芹菜有一个周期性任务功能,但是时间必须事先设置好,那么我如何用芹菜制作一个由用户给定时间的周期性任务呢

class UserMail(models.Model):
    user_mail = models.EmailField()
    auto_send_mail = models.BooleanField(default=False)
    time_set = models.TimeField(blank=True,null=True)
设置时间以获取用户在表单中发布时给定的时间。

使用线程。 您可以在

上获得更多详细信息,我认为这篇文章可以帮助您满足需要

另一个选项是设计一个周期性任务,每1分钟运行一次,该任务将查询
UserMail
,以检查某些记录是否在分钟内设置了
时间,并发送电子邮件。

还要注意的是,Cellery中的定期任务调度器并不是为处理数千个计划任务而设计的。

因此,基本上您希望使用用户输入的时间创建任务。O拥有的是一个API,我以POST请求的形式从用户那里获取输入

在这里,我处理了用户在名为response的变量中发送的数据。 然后,我们用用户给定的时间(以分钟为单位)创建一个时间表。 最后,我们完成所需的周期性任务。在您的例子中,如果在名为resources的应用程序中有一个名为send_mail In tasks.py file的函数,则代码如下所示

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

您可以使用芹菜ETA,因此当用户保存时间设置时,您可以使用timedelta向芹菜添加任务。您好,请修复您的缩进!嗨,亚当,谢谢你的通知。我修正了压痕。