Найти - Пользователи
Полная версия: middleware - сильно не понятно.
Начало » Django » middleware - сильно не понятно.
1
I159
Разбираюсь в 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. В чем ошибки? Как правильно реализовать эту задачу?
Chern
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…
I159
Chern
Вы же возвращаете request…
Верно, гоню - спасибо. Ок, теперь ошибки нет, но и response не изменился - добавленная строка не выводится в браузер. Что сделано не правилно? Что не сделано?
Теперь так:
class CoolMiddleware(object):
def process_response(self, request, response):
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
return response
Chern
I159
Что сделано не правилно? Что не сделано?
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
response.content = content
Либо же работать напрямую с response.content
I159
Разобрался. Django is Python ;) Спасибо, Chern.
Александр Кошелев
Chern
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
response.content = content
Либо же работать напрямую с response.content
Кстати, это тоже не должно работать.

Строка это immutable объект поэтому результат replace надо всё-таки чему-то присвоить.
I159
Ну, да:). У меня так работает:
class CoolMiddleware(object):
def process_response(self, request, response):
response.content = response.content.replace('</body>', 'CoolMiddleware works here</body>')
return response
Chern
Александр Кошелев
Кстати, это тоже не должно работать.

Строка это immutable объект поэтому результат replace надо всё-таки чему-то присвоить.
Виноват. Постоянно на этом спотыкаюсь и постоянно забываю. )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB