2012-08-02 18 views
13

Este error aparece a veces en Middleware personalizado en el método process_response. Tengo la siguiente lista de middleware:El objeto 'WSGIRequest' no tiene atributo 'sesión'

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' 

]

Así sesión de middleware se coloca antes de mi middleware. No tengo expresiones del request.session en el código fuente. Este es el método 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 

No sé por qué podría suceder en absoluto.

EDITAR 03-08-2012 12-30

Parece navegador solicitante favicon:

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

¿No hay ningún comportamiento predeterminado en Django para resolver este url? Porque no especifiqué la vista que debería manejar esta solicitud. Y no uso favicon en el código fuente de la página. Así que supongo que es un navegador que solicita /favicon.ico. Supongo que en caso de error 404, HttpRequest no se compilaría correctamente, por lo que no es de extrañar que no tenga ninguna sesión en el objeto de solicitud. Pero son solo mis suposiciones.

También si es necesario, estoy usando el servidor django dev al obtener este error.

EDITAR 13-00

me han solucionado este problema favicon pero sigue recibiendo el error. ¿Por qué la sesión puede no existir en la solicitud?

+0

¿Cuál es el problema? Si obtiene un error, ¿puede agregar el registro a esta pregunta? – StefanNch

+0

Oh, está en el título: el objeto 'WSGIRequest' no tiene atributo 'sesión'. Ocurre cada vez que trato de obtener cualquier url de mi sitio. Se produce en el método process_response de application.middleware.LastCampaignSessionMiddleware. – sunprophit

Respuesta

19

El problema estaba en el orden intermedio.

CommonMiddleware devuelve HttpResponsePermanentRedirect en los casos en que se debe agregar 'www' o posterior '/' (APPEND_SLASH y PREPEND_WWW en la configuración) para solicitar la URL. En tal caso, django deja de buscar en la lista de middleware los métodos process_request y comienza a ejecutar los métodos process_response.

Es malo que no haya información sobre dicho comportamiento para middleware estándar de django (es decir, el middleware podría devolver en algunos casos el objeto HttpResponse).

+2

Gracias, excelente explicación, esto es exactamente lo que me está sucediendo y por qué. En lugar de poner SessionMiddleware primero, también puedes protegerlo mediante: 'if hasattr (request, 'session')' – dkamins

Cuestiones relacionadas