Hou*_*man 5 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(...)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都那么好,但是如果我还要向用户显示弹出窗口作为提醒呢?
Twitter引导程序允许创建弹出窗口并从javascript中显示它们:
$(this).modal('show');
Run Code Online (Sandbox Code Playgroud)
问题是,芹菜工作者守护程序如何在用户的浏览器上运行此javascript?也许我走错了路,这根本不可能.因此问题仍然是芹菜上的cronjob可以用来在浏览器上实现ui通知吗?
好吧,你不能使用Django消息框架,因为任务无法访问用户的请求,也不能将请求对象传递给工作者,因为它们是不可删除的.
但你绝对可以使用django-notifications之类的东西.您可以在任务中创建通知,并将其附加到相关用户.然后,您可以从视图中检索这些消息,并根据自己的喜好在模板中处理它们.用户可以在下次请求时看到通知(或者您可以使用AJAX轮询实时通知或HTML5 websockets实时实时[请参阅django-websocket ]).
是的,这是可能的,但并不容易。进行/模拟服务器到客户端通信的方法:
轮询
最简单的方法是从 javascript 轮询服务器。您的 celery 任务可以在数据库中创建可以通过 URL 获取的行,例如/updates检查新更新、将行标记为已读并返回它们。
长轮询 通常称为彗星。客户端向服务器发出请求,该请求将一直等待,直到服务器决定返回某些内容。例如,请参见django-comet 。
websocket 要启用真正的服务器到客户端通信,您需要从客户端到服务器的开放连接。django-socketio和django-websocket是使这成为可能的可重用应用程序的示例。
根据您问题的上下文判断,我的建议是:要么进行一些基本的民意调查,要么坚持使用电子邮件。
| 归档时间: |
|
| 查看次数: |
3085 次 |
| 最近记录: |