7

我现在已成功设置 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 bootstrap 允许创建弹出窗口并从 javascript 显示它们:

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

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

4

2 回答 2

7

好吧,您不能使用Django 消息框架,因为任务无法访问用户的请求,并且您也不能将请求对象传递给工作人员,因为它们是不可挑选的。

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

于 2012-11-30T17:50:49.233 回答
4

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

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

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

websocket 要启用真正的服务器到客户端通信,您需要从客户端到服务器的开放连接。django-socketiodjango-websocket是使这成为可能的可重用应用程序的示例。

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

于 2012-11-30T17:51:45.603 回答