2012-08-02 14 views
13

Talvolta ricevo questo errore nel middleware personalizzato nel metodo process_response. Ho il seguente elenco di middleware:L'oggetto 'WSGIRequest' non ha attributo 'sessione'

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' 

]

Così sessione middleware è posto prima del mio middleware. Non ho nessuna espressione del request.session nel codice sorgente. Questo è il metodo 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 

Non certo perché potrebbe succedere a tutti.

EDIT 03-08-2012 12-30

Sembra che il browser favicon richiedente:

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

Non c'è comportamento predefinito in Django per risolvere questo URL? Perché non ho specificato esplicitamente la vista che dovrebbe gestire questa richiesta. E io non uso favicon nel codice sorgente della pagina. Quindi immagino che sia il browser che richiede /favicon.ico. Immagino che in caso di errore 404 HttpRequest non costruisca correttamente quindi non mi stupisco che non abbia sessione nell'oggetto richiesta. Ma sono solo le mie supposizioni.

Inoltre, se necessario, sto utilizzando il server dev django mentre ricevo questo errore.

EDIT 13-00

ho fissato questo problema con favicon, ma ancora ottenere l'errore. Perché la sessione potrebbe non esistere in richiesta?

+0

Quindi qual è il problema? Se ricevi un errore puoi aggiungere il log a questa domanda? – StefanNch

+0

Oh, è nel titolo: l'oggetto 'WSGIRequest' non ha attributo 'sessione'. Si verifica ogni volta che sto cercando di ottenere qualsiasi URL del mio sito. Si verifica nel metodo process_response di application.middleware.LastCampaignSessionMiddleware. – sunprophit

risposta

19

Il problema era nell'ordine dei middlewares.

CommonMiddleware restituisce HttpResponsePermanentRedirect nei casi in cui per richiedere url sono stati aggiunti "www" o trailing "/" (APPEND_SLASH e PREPEND_WWW nelle impostazioni). In tal caso, django interrompe la ricerca nell'elenco dei middleware per i metodi process_request e inizia a eseguire i metodi process_response.

È male non ci sono informazioni su tale comportamento per i normali media django (ad esempio il middleware potrebbe restituire in alcuni casi l'oggetto HttpResponse).

+2

Grazie - ottima spiegazione, questo è esattamente quello che mi sta succedendo e perché. Invece di mettere SessionMiddleware al primo posto, puoi anche fare attenzione a questo: 'if hasattr (request, 'session')' – dkamins