2010-09-09 22 views
8

Me postulo Django 1.2.2 y me sale el siguiente error al intentar iniciar sesión en la administración de Django:¿Por qué el inicio de sesión de administración de Django me da error 403 CSRF?

prohibida (403) Verificación CSRF falló. Solicitud abortada

razón dada para el fracaso:

Sin CSRF o cookie de sesión.

** No he realizado ninguna personalización en el administrador barebones y cuando inspecciono la fuente hay un token CSRF en la forma en la que creo que es el lugar correcto.

Cuando miro la solicitud real que se está enviando, se envía un token csrf, pero Django todavía dice que la verificación CSRF falló.

¿Alguien puede indicarme la dirección correcta? ¿Por qué está pasando esto?

+1

¿No apareció Django 1.2.2 ayer? –

+0

Sí, he revisado mi pregunta. Eliminé y reinstalé Django hoy. Aunque estaba obteniendo el error antes de hacer eso. Estaba usando 1.2.1 antes. – thomallen

Respuesta

5

1) ¿Tiene 'django.middleware.csrf.CsrfViewMiddleware' en su settings.MIDDLEWARE_CLASSES?

2) ¿Estás seguro de que siempre has estado en 1.2.2? Eso solo salió anoche ...

+0

Sí, lo tengo en MIDDLEWARE_CLASSES. De hecho, creo que estaba ejecutando 1.2.1 hasta esta mañana cuando lo reinstalé por completo. Buena atrapada. – thomallen

+0

Si inspecciono la solicitud en Charles, puedo ver que hay un csrfmiddlewaretoken en la solicitud.Entonces CSRF está funcionando si el token se está generando. ¿Pero por qué no está viendo el token cuando se envía el formulario? – thomallen

1

Según el docs, no solo necesita el campo de formulario oculto csrf, sino también la cookie csrftoken. El mensaje de error que proporcionó también sugiere una cookie faltante.

Me gustaría buscar en las cookies de su navegador para asegurarse de que la cookie csrftoken está presente.

+2

Finalmente descubrí que solo estaba obteniendo este error en Firefox. Para corregir este problema ingresé en mis cookies de Firefox y las borré todas para el sitio de django. Una vez que el navegador tenía una nueva cookie csrf para el sitio, funcionaba bien. Debe haber sido una cookie obsoleta o algo así ... – thomallen

+0

Estoy teniendo este problema otra vez con el mismo sitio. La solución que dije arriba no funciona esta vez. Django ni siquiera está generando una cookie CSRF ahora. – thomallen

6

He tenido el mismo problema en Django 1.2.1 FINAL. Como sabía que Django en nuestro sitio de producción nunca se actualizaría desde 1.0 (por varias razones), encontré una solución que implementé en mi versión de desarrollo de settings.py, dejando intocable la configuración de producción.

Crear un archivo middleware.py en el directorio de aplicación con el siguiente código:

class disableCSRF: 
    def process_request(self, request): 
     setattr(request, '_dont_enforce_csrf_checks', True) 
     return None 

Luego, en su versión de desarrollo de settings.py, insertarlo en MIDDLEWARE_CLASSES:

'your_app_name.middleware.disableCSRF', 

Quizás no sea la solución más segura, pero nuestro sitio Django es estrictamente interno, por lo que existe un riesgo mínimo para cualquier tipo de acciones maliciosas. Esta solución es simple y no implica cambios en las plantillas/vistas, y funcionó al instante (a diferencia de otras que he probado).

Espero que alguien en una situación similar a la mía lo encuentre útil.

El crédito va para John McCollum, en cuyo site encontré esto.

+0

¿Quiere decir "proyecto" en lugar de "aplicación" aquí? – thomallen

+0

Cuando pruebo esta solución, me da un error al iniciar sesión en el administrador: "Parece que su navegador no está configurado para aceptar cookies. Habilite las cookies, vuelva a cargar esta página y vuelva a intentarlo". – thomallen

+0

Tuve que usar este método. Por alguna razón, el servidor de mi trabajo está limpiando las cookies. Pensamos que se debía a espacios en blanco, pero todavía está arrojando errores. Gracias por esta genial solución! – mk2

Cuestiones relacionadas