2012-08-02 51 views
13

Ten błąd występuje czasami w niestandardowym oprogramowaniu pośrednim w metodzie process_response. Mam następujący wykaz middleware:Obiekt "WSGIRequest" nie ma atrybutu "sesja"

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' 

]

więc sesja middleware jest umieszczony przed moim middleware. Nie mam żadnych wyrażeń del request.session w kodzie źródłowym. Jest to metoda 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 

Nie wiem, dlaczego to się może zdarzyć w ogóle.

EDIT 03-08-2012 12-30

Wygląda przeglądarki wzywającego favicon:

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

ma tam domyślne zachowanie w Django aby rozwiązać ten link? Ponieważ nie określiłem wyraźnie widoku, który powinien obsłużyć to żądanie. I nie używam favicon w kodzie źródłowym strony. Domyślam się, że to przeglądarka, która żąda /favicon.ico. Przypuszczam, że w przypadku błędu 404 HttpRequest nie zbudowałoby poprawnie, więc nic dziwnego, że nie mam sesji w obiekcie żądania. Ale to tylko moje założenia.

Również jeśli jest to konieczne, używam serwera dev django podczas pobierania tego błędu.

EDIT 13-00

Mam ustalony ten problem z favicon ale wciąż otrzymuję błąd. Dlaczego sesja może nie istnieć w żądaniu?

+0

Jaki jest problem? Jeśli pojawi się błąd, możesz dodać dziennik do tego pytania? – StefanNch

+0

Och, jest w tytule: obiekt "WSGIRequest" nie ma atrybutu "sesja". Występuje za każdym razem, gdy próbuję uzyskać dowolny adres URL mojej witryny. Występuje w metodzie process_response aplikacji.middleware.LastCampaignSessionMiddleware. – sunprophit

Odpowiedz

19

Problem był w porządku middlewares.

CommonMiddleware zwraca HttpResponsePermanentRedirect w przypadkach, gdy prośba o dodanie adresu URL została dodana "www" lub końcowa "/" (ustawieniaEND_SLASH i PREPEND_WWW w ustawieniach). W takim przypadku django przestaje przeglądać listę oprogramowania pośredniego dla metod process_request i zaczyna uruchamiać metody process_response.

To źle, nie ma informacji o takim zachowaniu się dla standardowych django middleware (tzn. Middleware mogło zwrócić w niektórych przypadkach obiekt HttpResponse).

+2

Dziękuję - doskonałe wyjaśnienie, dokładnie to, co się ze mną dzieje i dlaczego. Zamiast umieszczać SessionMiddleware jako pierwsze, możesz również strzec się tego: 'if hasattr (request, 'session')' – dkamins

Powiązane problemy