Может ли представление Django сначала вернуть свой заголовок? - PullRequest
3 голосов
/ 04 марта 2011

У меня особенно тяжелое представление, которое может потребовать несколько раз вернуть отправку формы себе, но мне нужен заголовок сразу.

Есть ли способ вернуть часть заголовка шаблонапервый?например, мое представление возвращает что-то вроде:

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 голосов
/ 04 марта 2011

Насколько я знаю, нет способа сделать это напрямую.Лучше всего просто вернуть страницу с заголовком и функцией javascript, которая выбирает остальные данные страницы через AJAX.

0 голосов
/ 04 марта 2011

Не полностью протестировал это, но это должно работать в соответствии с документами.

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 голосов
/ 04 марта 2011

Да, это возможно. Вам нужно захватить каждый отдельный рендер в виде строки, а затем объединить строки, чтобы сформировать полное содержание ответа.

Вот низкоуровневый способ:

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)

Однако, если вы хотите сделать это по соображениям производительности, я бы обязательно сравнил время, необходимое для рендеринга сразу, с рендерингом по частям. Я думаю, что рендеринг одновременно - это лучший путь. Вы не можете вернуть ответ, пока вся вещь не будет обработана.

...