Django任务,提醒,通知

时间:2018-04-15 11:38:35

标签: python django redis rabbitmq celery

我在Django(Apache,Ubuntu)中有一个相当简单的Web应用程序,用于保存一些会议文档。会议的约会时间以日期时间格式存储在数据库(postgres)中。现在,我想要一个自定义提醒模块,用户可以设置他们的首选提醒。

例如:

会议将在某个特定日期举行(比如说2018年4月25日晚上8点),用户应该可以设置自定义提醒(例如通过短信,但问题不在于在会议开始前24小时发送文本或电子邮件 - 我得到了这个内容。

让我觉得这需要某种永久的过程浏览会议桌并检查now()是否是预约时间-24h,如果是,则执行提醒。

我从兔子和芹菜开始,但这些看起来有点复杂乍一看(here's one of the tutorials I found),看起来它不是为我所需要的而设计的。

所以,问题是 - 如何设置一个永久流程来检查现在是否设置提醒时间,如果是,则执行提醒任务?

编辑:尝试按照教程回答后出现一些错误。陷入第3步:

    (dj2_env) adrian@dev:~$ celery -A dj2 worker -l info
Traceback (most recent call last):
  File "/home/adrian/dj2_env/lib/python3.5/site-packages/celery/app/utils.py", line 361, in find_app
    found = sym.app
AttributeError: module 'dj2' has no attribute 'app'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/adrian/dj2_env/bin/celery", line 11, in <module>
    sys.exit(main())
  File "/home/adrian/dj2_env/lib/python3.5/site-packages/celery/__main__.py", line 14, in main
    _main()
  File "/home/adrian/dj2_env/lib/python3.5/site-packages/celery/bin/celery.py", line 326, in main
    cmd.execute_from_commandline(argv)
  File "/home/adrian/dj2_env/lib/python3.5/site-packages/celery/bin/celery.py", line 488, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/home/adrian/dj2_env/lib/python3.5/site-packages/celery/bin/base.py", line 279, in execute_from_commandline
    argv = self.setup_app_from_commandline(argv)
  File "/home/adrian/dj2_env/lib/python3.5/site-packages/celery/bin/base.py", line 481, in setup_app_from_commandline
    self.app = self.find_app(app)
  File "/home/adrian/dj2_env/lib/python3.5/site-packages/celery/bin/base.py", line 503, in find_app
    return find_app(app, symbol_by_name=self.symbol_by_name)
  File "/home/adrian/dj2_env/lib/python3.5/site-packages/celery/app/utils.py", line 366, in find_app
    found = sym.celery
AttributeError: module 'dj2' has no attribute 'celery'

好的,弄清楚了上面的错误 - 但是很奇怪,因为当我从dj2(项目)目录运行worker命令时它工作了8 |

2 个答案:

答案 0 :(得分:0)

你可以使用celery和rabbitmq。在celery中有一些称为周期性任务的东西,它允许您在给定特定时间的情况下运行任务,就像cron作业一样。

以下是Asynchronous tasks in Celery

的简单教程

它很好地理解芹菜的工作原理。它还包括配置等。

您可能需要做的是启动一个任务(每15分钟一次)查询数据库并在接下来的24小时内检查会议,然后通知用户。本教程的第4部分介绍了如何使用定期任务。

答案 1 :(得分:0)

Celery定期任务可能是最佳解决方案,但更简单的替代方案可能是从crontab运行的Django custom management command

管理命令将自动访问Django ORM,因此可以执行数据库检查并发送提醒。您可以从crontab运行它,例如:

# Run the command every 15 minutes
*/15 * * * * python /path/to/manage.py your_command_name

使用管理命令还可以让您在必要时从命令行手动执行提醒过程。