使用Django和Celery创建动态页面
我在我的 tasks.py
文件中注册了一个 Celery 任务。当有人向 /run/pk 发送 POST 请求时,我会用给定的参数来运行这个任务。这个任务还会执行其他任务(普通的 Python 函数),我希望每当一个子任务完成工作时,能够更新我的页面(也就是在 /run/pk 返回的 HttpResponse)。
这是我的任务:
from celery.decorators import task
@task
def run(project, branch=None):
if branch is None:
branch = project.branch
print 'Creating the virtualenv'
create_virtualenv(project, branch)
print 'Virtualenv created' ##### Here I want to send a signal or something to update my page
runner = runner(project, branch)
print 'Using {0}'.format(runner)
try:
result, output = runner.run()
except Exception as e:
print 'Error: {0}'.format(e)
return False
print 'Finished'
run = Run(project=project, branch=branch,
output=output, **result._asdict())
run.save()
return True
3 个回答
0
有一个叫做 Pusher 的服务,可以帮你处理HTML5中的推送通知的各种复杂问题。它提供了客户端和服务器端的库,来管理所有的消息和通知,同时也处理了HTML5 Websocket的一些细节。
2
自从这个问题被提出来已经过去很多年了,现在你可以通过Channels来实现这个功能,使用的是Django框架。
Channels网站自己介绍说,它是一个"让Django不仅能处理普通的HTTP请求,还能处理WebSockets和HTTP2的项目,并且可以在发送响应后继续运行代码,比如生成缩略图或进行后台计算。"
3
用Django给客户的浏览器发送推送通知其实不太简单。最简单的方法就是让客户端不停地向服务器询问更新,但这样会让服务器的工作量大增。下面是你可以选择的不同方案的更详细解释:
如果你不使用Django,通常会用websockets来发送这些通知。不过Django并不是为了使用websockets而设计的。这里有个不错的解释,讲了为什么会这样,以及一些关于如何使用websockets的建议: