我现在已经成功设置了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通知吗?
答案 0 :(得分:6)
好吧,你不能使用Django messages framework,因为任务无法访问用户的请求,也无法将请求对象传递给工作者,因为它们是不可用的。
但你绝对可以使用像django-notifications这样的东西。您可以在任务中创建通知,并将其附加到相关用户。然后,您可以从视图中检索这些消息,并根据自己的喜好在模板中处理它们。用户可以在下次请求时看到通知(或者您可以使用AJAX轮询进行实时通知,或使用HTML5 websockets进行实时[请django-websocket])。
答案 1 :(得分:3)
是的,这是可能的,但这并不容易。如何/模拟服务器到客户端的通信:
<强>轮询强>
最简单的方法是从javascript轮询服务器。您的celery任务可以在数据库中创建行,这些行可以通过像/updates
这样的URL来获取,它会检查新的更新,将行标记为已读并返回它们。
长轮询 通常被称为彗星。客户端向服务器发出请求,直到服务器决定返回某些内容为止。例如,请参阅django-comet。
<强>的WebSocket 强> 要启用真正的服务器到客户端通信,您需要从客户端到服务器的开放连接。 django-socketio和django-websocket是可重用应用的示例,可实现此目标。
我的建议根据你的问题的背景判断:要么进行一些基本的民意调查,要么坚持使用电子邮件。