Django异步更新单页模板

jra*_*amm 2 django templates asynchronous

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

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

extra_data显示在表中.如上面的函数所示,由于计算,页面需要很长时间才能加载extra_data.

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

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

Adr*_*uta 8

如果您打算继续使用芹菜,您需要2次观看:

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

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

    return render_to_response('viewA.html', {'task_id': task.id})
Run Code Online (Sandbox Code Playgroud)

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('')
Run Code Online (Sandbox Code Playgroud)

一旦用户的浏览器完成加载viewA,您将需要一些javascript来每隔X秒/分钟开始运行AJAX请求viewB以尝试检索芹菜任务结果(基于可用的芹菜任务ID).一旦AJAX请求成功检索到任务结果viewB,它就会使用户可以看到它.


Die*_* J. 6

任何对使用AJAX异步更新模板感兴趣的人都可以使用django-async-include(GitHub存储库).

该项目可以轻松地将静态块包含更改为异步块.这非常适合包含计算量大的模板块.

免责声明:我是这个项目的开发者.

  • 为什么不准确解释如何使用您的项目来解决这个问题中描述的问题? (3认同)
  • 我不是用"我的工具"发送垃圾邮件,因为我之前只提到过一次,因为a)它是开源的,b)它可能对OP有所帮助.我怎么找到这个老问题?通过在SO中搜索.有些人使用这个非常简单的Django应用程序,我能赢得什么?没有. (2认同)
  • 这个答案正在[讨论meta](https://meta.stackoverflow.com/questions/348617/spam-or-not-thats-the-question) (2认同)