【问题标题】:Django tasks, reminders, notificationsDjango 任务、提醒、通知
【发布时间】:2018-09-25 06:12:05
【问题描述】:

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

例如:

会议将在特定日期举行(比如说 2018 年 4 月 25 日晚上 8:00),用户应该能够设置自定义提醒(例如通过短信,但问题不在于发送文本或电子邮件- 我得到了这个覆盖)在会议时间前 24 小时被解雇。

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

我从 rabbitmq 和 celery 开始,但乍一看这些看起来有点复杂 (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|

【问题讨论】:

  • 指定的教程不包含你需要的周期性任务的信息。

标签: python django redis rabbitmq celery


【解决方案1】:

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

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

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

如果需要,使用管理命令还可以让您从命令行手动执行提醒过程。

【讨论】:

  • 我只是在想这是否是某种“硬编码”任务?用户似乎不太灵活和/或可调整,还是我错了?
【解决方案2】:

您可以为此使用 celery 和 rabbitmq。 celery 中有一种叫做周期性任务的东西,它可以让你在特定时间运行任务,就像 cron 作业一样。

这是Asynchronous tasks in Celery的简单教程

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多