Объект WSGIRequest не имеет атрибута 'session'

Я иногда получаю эту ошибку в пользовательском промежуточном программном обеспечении в методе process_response. У меня есть следующий список посредников:

MIDDLEWARE_CLASSES = [
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'application.middleware.LastCampaignSessionMiddleware'

]

Итак, промежуточное программное обеспечение для сеанса размещается перед моим промежуточным программным обеспечением. У меня нет выражений del request.session в исходном коде. Это метод process_response:

    def process_response(self, request, response):
        if 'last_campaign_id' in request.session and request.session['last_campaign_id']:
            if request.COOKIES['last_campaign_id'] != request.session['last_campaign_id']:
                response.set_cookie('last_campaign_id', request.session['last_campaign_id'])
        return response

Не знаю, почему это может произойти вообще.

EDIT 03-08-2012 12-30

Похоже, браузер запрашивает favicon:

[03/Aug/2012 10:26:42] "GET /favicon.ico/ HTTP/1.1" 404 6701

Нет ли поведения по умолчанию в django для решения этого URL-адреса? Потому что я явно не указал представление, которое должно обрабатывать этот запрос. И я не использую favicon в исходном коде страницы. Поэтому я предполагаю, что браузер, который запрашивает /favicon.ico. Я предполагаю, что в случае ошибки 404 HttpRequest не будет правильно построен, поэтому неудивительно, что у меня нет сеанса в объекте запроса. Но это только мои предположения.

Также, если это необходимо, я использую сервер django dev при получении этой ошибки.

РЕДАКТИРОВАТЬ 13-00

Я исправил эту проблему с favicon, но все еще получаю ошибку. Почему сеанс может отсутствовать в запросе?

Ответ 1

Проблема была в заказе среднего уровня.

CommonMiddleware возвращает HttpResponsePermanentRedirect в случаях, когда для запроса url были добавлены "www" или trailing '/' (APPEND_SLASH и PREPEND_WWW в настройках). В таком случае django перестает просматривать список промежуточного программного обеспечения для методов process_request и начинает запускать методы process_response.

Плохо нет информации о таком поведении для стандартных django middlewares (т.е. промежуточное ПО может возвращать в некоторых случаях объект HttpResponse).