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

时间:2012-11-30 17:24:36

标签: django celery 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通知吗?

2 个答案:

答案 0 :(得分:6)

好吧,你不能使用Django messages framework,因为任务无法访问用户的请求,也无法将请求对象传递给工作者,因为它们是不可用的。

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

答案 1 :(得分:3)

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

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

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

<强>的WebSocket 要启用真正的服务器到客户端通信,您需要从客户端到服务器的开放连接。 django-socketiodjango-websocket是可重用应用的示例,可实现此目标。

我的建议根据你的问题的背景判断:要么进行一些基本的民意调查,要么坚持使用电子邮件。