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

Django: How to trigger events based on datetimes in the database

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

我听说过用 celery 来安排任务,但它似乎对我的需要来说太过分了。

您是否需要在用户不刷新浏览器页面的情况下将它们打印到页面上?如果是这样,您需要编写一些 JavaScript AJAX 代码来不断轮询您的应用程序视图以获取要写入页面的新内容。

这是一个关于 AJAX 使用 Django 的示例教程:https://realpython.com/blog/python/django-and-ajax-form-submissions/

如果你不想使用 cron 那么你可以使用 django-cronograph.

在对 Stewart 的回答的评论中对您的用例进行澄清后,我建议使用 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 很容易设置。 $ 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)存在即可。