gpt4 book ai didi

Django异步更新单页模板

转载 作者:行者123 更新时间:2023-12-02 06:33:52 37 4
gpt4 key购买 nike

我有一个带有此函数的 django View 来获取模板的数据:

def get_context_data(self, **kwargs):
context = super(MyView, self).get_context_data(**kwargs)
context['extra_data'] = a_long_running_function()
return context

extra_data 显示在表格中。从上面的函数可以看出,由于extra_data的计算,页面加载时间较长。

那么如何立即显示页面,然后在计算 extra_data 时更新表格?

我了解如何使用 celery 使 a_long_running_function 异步执行,但我不知道如何使页面(现已加载,但缺少表的数据)获取该数据并自动更新?

最佳答案

如果您计划继续使用 celery,您将需要 2 个 View :

1.viewA 加载主页(没有 extra_data - 可能是在 HTML 中的旋转 gif 动画,以向用户传达有仍然是要在页面中加载的数据)。该 View 还将启动 celery 任务(但不会等待它完成)。它看起来类似于:

def viewA(request):
task = a_long_running_function.delay()

return render_to_response('viewA.html', {'task_id': task.id})

2.viewB 将在用户浏览器加载 viewA 后通过 AJAX 访问(其目的是提供 extra_data未由 viewA 加载)。它看起来类似于:

def viewB(request, task_id):
extra_data = a_long_running_function.AsyncResult(task_id)

if extra_data.ready():
return render_to_response('viewB.html', {'extra_data': extra_data.get()})

return HttpResponse('')

用户浏览器完成加载 viewA 后,您将需要一些 javascript 来开始运行 AJAX requests每 X 秒/分钟到 viewB 尝试检索 celery 任务结果(基于可用的 celery 任务 ID)。一旦 AJAX 请求成功从 viewB 检索任务结果,它就可以使其对用户可见。

关于Django异步更新单页模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31188499/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com