Django异步更新单页模板

2023-12-09

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

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

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

那么我怎样才能立即显示页面,然后更新表格呢?extra_data是计算出来的?

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


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

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

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

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

2.viewB用户浏览器加载后将通过 AJAX 访问viewA(其目的是提供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 请求每 X 秒/分钟viewB尝试检索 celery 任务结果(基于可用的 celery 任务 ID)。一旦 AJAX 请求成功检索任务结果viewB,它可以使其对用户可见。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django异步更新单页模板 的相关文章

随机推荐