Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 17, 2014 12:47:44

alexander0505
От: Moscow
Зарегистрирован: 2014-02-17
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Свой Middleware

Добрый день, прошу сильно не пинать, новичок в Django

Нужно перед рендером централизовано парсить данные, ну для начала хотя бы добавить слово в конец контента.
нашел похожую тему
http://python.su/forum/topic/11368/?page=1#post-71591

сделал так

class PublicationLink(object):
    def process_response(self, request, response):
     content = response.content
     content.replace('</body>', 'CoolMiddlweare </body>')
     response.content = content

но дебажа, наблюдаю что response.content не содержит весь контент ккак ожидалось, там толкьо начало документа, объявление скриптов и все
Контент заполняется уже после этого метода
Заранее спасибо!

Отредактировано alexander0505 (Фев. 17, 2014 13:45:27)

Офлайн

#2 Фев. 17, 2014 16:59:08

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Свой Middleware

Вообще топик надо создавать в разделе - Django. Я думаю перенесут модераторы.

По теме, писал как твой свой подобный промежуточный слой, столкнулся с таким нюансом, что обычные объекты ответа - HttpResponse, которые возвращают методы типа render, render_to_response нет возможности редактировать. Вместо этого в представлениях(viewes) необходимо возвращать объекты - SimpleTemplateResponse\TemplateResponse, заточенные специально под это дело(не понимаю, почему ими не заменят обычные HttpResponse), а в промежуточном слое использовать метод process-template-response.

Отредактировано buddha (Фев. 17, 2014 17:00:07)

Офлайн

#3 Фев. 18, 2014 14:37:17

alexander0505
От: Moscow
Зарегистрирован: 2014-02-17
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Свой Middleware

Тогда спрошу так:
был написан плагин для редактора ckeditor - а который позволяет указывать ссылку на существующий материал сайта. Он вставляет псевдоссылки , которые преобразуются в реальные с помощью специального метода перед рендером

Можно ли как то сделать это централизовано? сейчас это работает только там где я явно вызываю такой метод

Отредактировано alexander0505 (Фев. 18, 2014 14:39:32)

Офлайн

#4 Фев. 19, 2014 08:43:49

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Свой Middleware

Содержимое HttpResponse не получится отредактировать в middleware, содержимое SimpleTemplateResponse\TemplateResponse получится(это всего лишь классы-наследники).

Исходя из этого, если необходимо сделать это для всех представлений(централизовано), то необходимо заменить возвращаемые объекты этих представлений с HttpResponse(render(), render_to_response() ) на SimpleTemplateResponse\TemplateResponse и в методе process-template-response вставить ваш метод преобразования ссылки. Я бы так сделал.

Если нет возможности\желания менять возвращаемый объект всех представлений, запилите декоратор =) и навесьте его на необходимые представления)

Надеюсь понятно расписал.

Отредактировано buddha (Фев. 19, 2014 08:46:32)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version