Django/Celery 中的定期任务 - 如何在屏幕上通知用户



我现在已经成功地设置了 Django-celery 来检查我现有的任务,以便在任务到期时通过电子邮件提醒用户:

@periodic_task(run_every=datetime.timedelta(minutes=1))  
def check_for_tasks():      
    tasks = mdls.Task.objects.all()
    now = datetime.datetime.utcnow().replace(tzinfo=utc,second=00, microsecond=00)
    for task in tasks:
        if task.reminder_date_time == now:
            sendmail(...)

到目前为止一切顺利,但是如果我还想向用户显示一个弹出窗口作为提醒怎么办?

Twitter 引导程序允许创建弹出窗口并从 javascript 显示它们:

$(this).modal('show');

但问题是,芹菜工人守护程序如何在用户的浏览器上运行此 javascript? 也许我走错了路,这根本不可能。因此,问题仍然是是否可以使用芹菜上的 cronjob 在浏览器上实现 UI 通知?

好吧,你不能使用 Django 消息框架,因为任务无法访问用户的请求,你也不能将请求对象传递给 workers,因为它们是不可抓取的。

但是你绝对可以使用像django通知这样的东西。您可以在任务中创建通知并将其附加到相关用户。然后,您可以从视图中检索这些消息,并根据自己的喜好在模板中处理它们。用户将在下一个请求中看到通知(或者你可以使用 AJAX 轮询来获取实时通知,或者使用 HTML5 websocket 进行实时通知 [参见 django-websocket])。

是的,这是可能的,但这并不容易。执行/模拟服务器到客户端通信的方法:

投票最简单的方法是从javascript轮询服务器。您的 celery 任务可以在数据库中创建行,这些行可以通过 url 获取,例如 /updates 检查新的更新,将行标记为已读并返回它们。

长轮询通常被称为彗星。客户端向服务器发出请求,该请求一直挂起,直到服务器决定返回某些内容。例如,参见django-comet。

网络套接字要启用真正的服务器到客户端通信,您需要从客户端到服务器的开放连接。Django-socketio和Django-webSocket是可重用应用程序的例子,使这成为可能。

根据你的问题上下文判断,我的建议是:要么做一些基本的民意调查,要么坚持使用电子邮件。

相关内容

  • 没有找到相关文章

最新更新