Форум сайта python.su
Разбираюсь в 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 (most recent call last):На этой задаче хочу разобраться в middleware. В чем ошибки? Как правильно реализовать эту задачу?
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’
Офлайн
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…
Офлайн
ChernВерно, гоню - спасибо. Ок, теперь ошибки нет, но и response не изменился - добавленная строка не выводится в браузер. Что сделано не правилно? Что не сделано?
Вы же возвращаете request…
class CoolMiddleware(object):
def process_response(self, request, response):
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
return response
Отредактировано (Май 6, 2011 17:38:48)
Офлайн
I159
Что сделано не правилно? Что не сделано?
content = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
response.content = content
Офлайн
Разобрался. Django is Python ;) Спасибо, Chern.
Отредактировано (Май 6, 2011 19:16:09)
Офлайн
ChernКстати, это тоже не должно работать.Либо же работать напрямую с response.contentcontent = response.content
content.replace('</body>', 'CoolMiddlweare </body>')
response.content = content
Офлайн
Ну, да:). У меня так работает:
class CoolMiddleware(object):
def process_response(self, request, response):
response.content = response.content.replace('</body>', 'CoolMiddleware works here</body>')
return response
Офлайн
Александр КошелевВиноват. Постоянно на этом спотыкаюсь и постоянно забываю. )
Кстати, это тоже не должно работать.
Строка это immutable объект поэтому результат replace надо всё-таки чему-то присвоить.
Офлайн