Vdomike
@Vdomike
Веб-разработчик

Как написать middleware для вывода дополнительной строки на каждой странице?

Разбираюсь понемногу с middleware. Но разобраться пока не могу.
Вот такой пример у меня не работает: python.su/forum/topic/11368
Пишу я тоже process_response. В доках написано, что response is the HttpResponse. Проверяю, у меня он почему-то TemplateResponse. Это у меня что-то во вьюшках не так? Ну ладно, сделала вот так:
class MyOwnMiddleWare(object):
def process_response(self, request, response):
content = response.rendered_content
content = content.replace('</body>', ' my piece of text '</body>')
response = HttpResponse(content, content_type="text/html")
return response

И на некоторых страницах это работает. А на некоторых нет :))) Возникает ошибка 'HttpResponseRedirect' object has no attribute 'rendered_content', То есть response уже другой объект уже получается.
Как мне это поправить? Я вообще так делаю? А то вот еще есть process_template_response метод, может его надо?
  • Вопрос задан
  • 523 просмотра
Решения вопроса 1
winordie
@winordie
Лучшая документация -- исходники
А то вот еще есть process_template_response метод, может его надо?

Да, именно так. Оказалось не совсем.

Пишу я тоже process_response. В доках написано, что response is the HttpResponse. Проверяю, у меня он почему-то TemplateResponse.

TemplateResponse наследуется от SimpleTemplateResponse, для которого родительским является HttpResponse. Поэтому "response is the HttpResponse".

Возникает ошибка 'HttpResponseRedirect' object has no attribute 'rendered_content', То есть response уже другой объект уже получается.

rendered_content -- это свойство (property), которое устанавливается в SimpleTemplateResponse, который, как я говорил выше, является родительским классом для TemplateResponse. Но HttpResponseRedirect(HttpResponseRedirectBase) наследуется напрямую от HttpResponse, поэтому у него нет свойства rendered_content.

по поводу отличия process_response и process_template_response

process_template_response выполняется только если у response есть метод render, а process_response выполняется всегда. Логику можно посмотреть process_template_response и process_response
Метод render задается в классе SimpleTemplateResponse от которого, как мы выяснили, наследуется TemplateResponse, но не HttpResponseRedirect.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
un1t
@un1t
Проверяй response.status_code - если 200 то подменяй, если другой то не подменяй.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы