Django:如何根据数据库中的日期时间触发事件

时间:2015-06-03 17:16:24

标签: python django database celery django-celery

我有一个简单的Django应用程序,其中包含一个数据库,用于存储我希望它们打印到屏幕的一系列消息和日期时间。有没有办法让Django调用一个方法来检查是否需要打印任何新消息,如果是,打印它们?

我听说过芹菜用于安排任务,但似乎对于我需要的东西来说太过分了。

3 个答案:

答案 0 :(得分:2)

在对斯图尔特答案的评论中澄清您的用例后,我建议使用cronjobs和自定义manage.py命令。

<强>模型
要过滤掉所有尚未发送的通知,最好在模型上添加一个标记,例如is_notified = models.BooleanField(default=False)。通过这种方式,可以快速轻松地过滤必要的消息,例如,与MyModel.objects.filter(is_notified=False, 'send_on__lte': datetime.now())

自定义manage.py命令
在自定义manage.py命令中,您可以完全访问Django设置。编写它们记录在Writing custom django-admin commands

该命令通常(至少):

  • 过滤所有应发送的通知
  • 迭代他们并尝试发送电子邮件
  • 成功后,将is_notified设置为True并保存实例

<强>的cronjob
cronjob很容易设置。 $ crontab -l将列出当前安装的所有cronjobs。 $ crontab -e将打开默认编辑器(可能是vi(m)或nano)以添加新的cronjobs。

示例:每5分钟运行一次命令:

*/5 * * * * /home/foobar/my-virtualenv/bin/python /home/foobar/my-django-dir/manage.py my_django_command >> /home/logs/my_django_command.log 2>&1

通过将代码段粘贴到调用$ crontab -e并保存文件后打开的文件中的新行来完成添加。

<强> */5 * * * *
指定每五分钟运行一次cronjob。

<强> /home/foobar/my-virtualenv/bin/python
指定从 virtualenv (如果使用的话)而不是系统版本调用Python。

<强> /home/foobar/my-django-dir/manage.py my_django_command
像你一样调用你的 manage.py 命令。

<强> >> /home/logs/my_django_command.log 2>&1
指定 manage.py 命令生成的所有输出(标准输出和错误)将保存到文件 my_django_command.log 。只需确保目录(在本例中为 home / logs )存在。

答案 1 :(得分:0)

您是否需要将它们打印到页面而无需用户在浏览器中刷新页面?如果是这样,您需要编写一些JavaScript AJAX代码来连续轮询您的应用程序视图,以便将新内容写入页面。

以下是使用Django的AJAX示例教程:https://realpython.com/blog/python/django-and-ajax-form-submissions/

答案 2 :(得分:0)

如果您不想使用cron,则可以使用django-cronograph