使用Django和Celery创建动态页面

5 投票
3 回答
1973 浏览
提问于 2025-04-17 06:07

我在我的 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向用户推送HTTP响应

如果你不使用Django,通常会用websockets来发送这些通知。不过Django并不是为了使用websockets而设计的。这里有个不错的解释,讲了为什么会这样,以及一些关于如何使用websockets的建议:

使用websockets和Python/Django(/twisted?)进行操作

撰写回答