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

标签 python django database celery django-celery

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

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

最佳答案

在对斯图尔特答案的评论中澄清您的用例后,我建议使用 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)存在即可。

关于python - Django:如何根据数据库中的日期时间触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30626616/

相关文章:

python - 如何释放所有内存pytorch是从gpu内存中获取的

python - 将 json 数据从 django 发送到 d3.js

python - 如何在可重写的类方法上使用装饰器

python - Django-forms : 'WSGIRequest' object has no attribute 'get' 问题

mysql - 使用 PHP 在 mySQL 数据库中插入记录时遇到问题

database - 如何使用正确的索引存储视频

java - 如何在android中使用契约(Contract)类?

python - 使用 Python 在 HDFS 上写入

python - 如何从 Python 横向打印 PDF 文件到打印机?

Python在运行时从另一个模块更改函数的局部变量