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)存在即可。
我有一个简单的 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)存在即可。