5

我在我的tasks.py文件中注册了一个 Celery 任务。当有人发布到 /run/pk 时,我使用给定的参数运行任务。此任务还执行其他任务(普通 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
4

3 回答 3

3

不幸的是,使用 Django 向客户端浏览器发送推送通知并不容易。最简单的实现是让客户端不断地轮询服务器以获取更新,但这会大大增加服务器必须完成的工作量。以下是对您的不同选项的更好解释:

Django 向用户推送 HTTP 响应

如果你没有使用 Django,你会使用 websockets 来获取这些通知。然而 Django 不是为使用 websockets 而构建的。这是一个很好的解释为什么会这样,以及如何使用 websockets 的一些建议:

使用 websockets 和 python / django ( / twisted? ) 移动

于 2011-11-11T17:53:05.283 回答
2

自从提出这个问题多年以来,Channels是您现在可以使用 Django 实现此目的的一种方式。

然后 Channels 网站将自己描述为“使 Django 能够处理的不仅仅是简单的 HTTP 请求,包括 WebSockets 和 HTTP2,以及在发送响应后运行代码的能力,例如缩略图或背景计算。”

于 2017-07-09T00:43:35.970 回答
0

有一个名为Pusher的服务将处理 HTML5 中推送通知的所有杂乱部分。他们提供客户端和服务器库来处理所有消息和通知,同时处理所有 HTML5 Websocket 细微差别。

于 2012-07-10T16:18:08.137 回答