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

时间:2011-03-04 03:32:08

标签: python django wsgi

我有一个特别沉重的观点,可能需要多次将表单发布回自身,但我需要立即使用标题。

有没有办法首先返回模板的标题部分?例如我的观点返回的内容如下:

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>';
?>

3 个答案:

答案 0 :(得分: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)

但是,如果你出于性能原因想要这样做,我会确保比较一次渲染所有时间与渲染片段所需的时间。我认为一次渲染是最好的方法。在完成所有事情之前,您无法返回响应。

答案 1 :(得分:0)

据我所知,没有办法直接这样做。最好的办法是简单地返回一个只包含标题的页面和一个通过AJAX获取页面其余部分数据的javascript函数。

答案 2 :(得分: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())