Django视图是否可以先返回其标题?

3

我有一个特别重的视图,可能需要多次将表单发布到自身,但我需要立即返回头部。

是否有办法使模板的头部部分先返回?例如,我的视图返回类似以下内容:

return HttpResponse(Template('
  {% extends "base.html" %}
  {% block content %} FOO {% endblock %}
'))

理想情况下,我希望能够像这样做一些事情:
partialResponse = request.renderUntilBlock('content')
# lots of work
return partialResponse.extend(Template('
  {% block content %} FOO {% endblock %}
'))

更新:显然,PHP的结构不同,但这就是我希望效仿的内容。
<?php
echo '<html><head><title>Hi!</title</head><body>';
ob_flush(); flush();
# header has now been output to the client
# do lots of work
echo '<h1>done</h1></body></html>';
?>

让我确认一下,因为我觉得我没有理解 :) 你想要渲染到内容块,返回视图并返回一个包含该点之前页面的 HttpResponse,然后让视图继续渲染页面的其余部分吗?当然,你不能直接这样做。 - dappawit
@dappawit 刚刚更新了问题,希望能澄清一下 :) - Long Ears
好的...那么你是想能够分步渲染页面吗?先渲染到内容块,然后返回视图,再渲染一些,返回视图,以此类推。 - dappawit
@dappawit 我只需要渲染页面一次,但是页头和其他内容之间会有很长的时间间隔,因此我希望确保先渲染页头。 - Long Ears
3个回答

0

是的,这是可能的。你需要做的是将每个单独的渲染捕获为字符串,然后将这些字符串连接起来形成响应的完整内容。

以下是低级别的方法:

from django.template import Context, Template
t1 = Template("My name is {{ my_name }}.")
c1 = Context({"my_name": "Adrian"})
s = t.render(c1)
t2 = Template("My name is {{ my_name }}.")
c2 = Context({"my_name": "Adrian"})  # You could also use the same context with each template if you wanted.
s += t.render(c2)

return HttpResponse(s)

然而,如果您想出于性能原因这样做,我建议确保比较一次性渲染和分段渲染所需的时间。总体而言,我认为一次性渲染是最好的选择。无论如何,在整个内容渲染完成之前,您都无法返回响应。


这似乎是正确的方向,但它是否仍然一次性传递整个页面?我的问题的关键是能够首先将标题呈现给客户端,然后再延迟我的视图中的工作。 - Long Ears
哦,那么只使用Django没有办法做到这一点,你必须走AJAX的路线。在Django中渲染是在服务器上进行的,与浏览器中的渲染无关。 - dappawit

0

没有完全测试过,但根据文档应该可以正常工作。

from django.template import Context, Template

def responder():
    yield '' # to make sure the header is sent

    # do all your work

    t = Template('''
        {% extends "base.html" %}
        {% block content %} FOO {% endblock %}
    ''')
    yield t.render(Context({}))

return HttpResponse(responder())

0
据我所知,没有直接实现这个的方法。你最好的选择是返回一个只有头部和一个通过 AJAX 获取页面其余数据的 JavaScript 函数的页面。

我不想通过ajax来完成这个操作的原因是,这个视图可能需要多次返回一个表单,所以我也必须通过ajax来处理所有的表单操作。 - Long Ears
@长耳朵:在费尽周折之前,我建议先测量性能并确定这个功能确实有必要,并且会使您的应用程序受益。 - dappawit
在这种情况下,视图可能需要10秒钟的时间,然后返回一个表单以提交给自身,当提交时需要另外10秒钟。我需要首先输出标题以设置JS侦听器,以报告所有这些消息队列。 - Long Ears
@长耳朵:10秒?哇,听起来肯定有更好的方法(虽然显然我不知道你的需求,所以也许没有)。不幸的是,我不知道在Django中直接实现你想要做的事情的方法。可能有一些我不知道的技巧。(这很有可能,因为在所有的技巧中,我只了解其中一小部分。) - dappawit
@Drew,@dappawit非常感谢。我会再等一段时间,以防有人突然想到什么,但是非常感谢你们的帮助 :) - Long Ears
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接