Уведомления

Группа в Telegram: @pythonsu

#1 Май 6, 2011 15:42:27

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

middleware - сильно не понятно.

Разбираюсь в middleware, прочел доки, пару статей. Теория понятна в общих чертах - что процессы от запроса до ответа можно переопределять… Решил сделать нечто совсем простое в middleware, добавить в конец страницы слово. Т.к. понимание функционирования middleware ко мне еще не прибыло, ткнул пальцем в небо:

class CoolMiddleware(object):
def process_response(self, request, response):
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
return request
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.cool.CoolMiddleware',
)
В браузер передается traceback:
Traceback (most recent call last):

File “/usr/local/lib/python2.6/dist-packages/django/core/servers/basehttp.py”, line 280, in run
self.result = application(self.environ, self.start_response)

File “/usr/local/lib/python2.6/dist-packages/django/core/servers/basehttp.py”, line 674, in __call__
return self.application(environ, start_response)

File “/usr/local/lib/python2.6/dist-packages/django/core/handlers/wsgi.py”, line 252, in __call__
response = middleware_method(request, response)

File “/usr/local/lib/python2.6/dist-packages/django/middleware/common.py”, line 84, in process_response
if response.status_code == 404:

AttributeError: ‘WSGIRequest’ object has no attribute ‘status_code’
На этой задаче хочу разобраться в middleware. В чем ошибки? Как правильно реализовать эту задачу?



Офлайн

#2 Май 6, 2011 16:42:08

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

middleware - сильно не понятно.

http://docs.djangoproject.com/en/dev/topics/http/middleware/

“process_response() must return an HttpResponse object. It could alter the given response, or it could create and return a brand-new HttpResponse.”

Вы же возвращаете request…



Офлайн

#3 Май 6, 2011 17:35:47

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

middleware - сильно не понятно.

Chern
Вы же возвращаете request…
Верно, гоню - спасибо. Ок, теперь ошибки нет, но и response не изменился - добавленная строка не выводится в браузер. Что сделано не правилно? Что не сделано?
Теперь так:
class CoolMiddleware(object):
def process_response(self, request, response):
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
return response



Отредактировано (Май 6, 2011 17:38:48)

Офлайн

#4 Май 6, 2011 18:07:54

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

middleware - сильно не понятно.

I159
Что сделано не правилно? Что не сделано?
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
response.content = content
Либо же работать напрямую с response.content



Офлайн

#5 Май 6, 2011 19:12:37

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

middleware - сильно не понятно.

Разобрался. Django is Python ;) Спасибо, Chern.



Отредактировано (Май 6, 2011 19:16:09)

Офлайн

#6 Май 6, 2011 19:58:14

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

middleware - сильно не понятно.

Chern
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
response.content = content
Либо же работать напрямую с response.content
Кстати, это тоже не должно работать.

Строка это immutable объект поэтому результат replace надо всё-таки чему-то присвоить.



Офлайн

#7 Май 6, 2011 20:00:10

I159
От:
Зарегистрирован: 2010-12-09
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

middleware - сильно не понятно.

Ну, да:). У меня так работает:

class CoolMiddleware(object):
def process_response(self, request, response):
response.content = response.content.replace('</body>', 'CoolMiddleware works here</body>')
return response



Офлайн

#8 Май 6, 2011 22:58:22

Chern
От: Киев
Зарегистрирован: 2010-09-15
Сообщения: 71
Репутация: +  3  -
Профиль   Отправить e-mail  

middleware - сильно не понятно.

Александр Кошелев
Кстати, это тоже не должно работать.

Строка это immutable объект поэтому результат replace надо всё-таки чему-то присвоить.
Виноват. Постоянно на этом спотыкаюсь и постоянно забываю. )



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version