Prohibida la verificación de CSRF (403). Solicitud abortada. Incluso utilizando el {% csrf_token%}

Estoy tratando de hacer un inicio de sesión en django pero me sale este error, reviso la documentación de CSRF y nada funciona para mí.

Aquí está el HTML:

 

Como se ve arriba, uso el {% csrf_token%} y tengo ‘django.middleware.csrf.CsrfViewMiddleware’ en mis aplicaciones instaladas.

Y mis puntos de vista son:

 from django.http import HttpResponse,HttpResponseRedirect from django.template.loader import get_template from django.template import Context from datetime import datetime from django.shortcuts import render_to_response from django.http import HttpResponseRedirect from django.contrib import auth from django.core.context_processors import csrf from models import * from django.shortcuts import get_object_or_404 from forms import * from django.template.context import RequestContext from django.contrib.auth.decorators import login_required from django.contrib.auth import authenticate, login def login(request): c = {} c.update(csrf(request)) return render_to_response('login.html', c) def auth_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: auth.login(request.user) return HttpResponse('/accounts/loggedin') else: return HttpResponse('/accounts/invalid') 

Redirijo a otro archivo HTML donde no uso el {% csrf_token%}.

Teoría


Se requieren un par de cosas para hacer que la protección csrf funcione (consulte los documentos ):

  1. Su navegador tiene que aceptar cookies de su servidor.
  2. Asegúrese de tener ‘ django.middleware.csrf.CsrfViewMiddleware' incluido como middleware en su settings.py (también puede usar el decorador csrf_protect () en las vistas particulares que desee proteger)
  3. Asegúrese de pasar el token django.core.context_processors.csrf de django.core.context_processors.csrf al administrador de contexto.

Cuando cargue su página, eche un vistazo a la fuente de la página con su navegador favorito. No abra el archivo html de la plantilla, abra la url que apunta a la vista que contiene el formulario. Mire dónde colocó el {% csrf_token %} . Si ves algo como

  

deberias estar bien

Si, por otro lado, ve NOTPROVIDED , algo ha fallado al crear el token csrf. Al buscar en el código fuente ( context_processors.py y csrf.py ), podemos averiguar qué:

  • csrf(request) devuelve {'csrf_token': 'NOTPROVIDED'} si get_token(request) devuelve Ninguno.
  • get_token(request) devuelve request.META.get("CSRF_COOKIE", None) .

Supongo que esto significa que devolverá None si la cookie no se crea con éxito.

Fijar


Para ti, esto significa que primero debes reemplazar

 

con

 
{% csrf_token %} (...)

Nos gustaría que el campo csrf esté dentro de

...

, no dentro de

. Como el código está en este momento, se convertirá a

 
>

y preferiríamos

 

Después de eso, eche un vistazo al código fuente y vea si puede encontrar el campo csrf. Si puedes verlo, todo debería funcionar en teoría.

También puede verificar que la cookie csrf se haya configurado en su navegador, por ejemplo, en Chrome, haga clic con el botón derecho en la página web y seleccione Insepect Element . Seleccione la pestaña Resources , y haga clic en cookies. Debe encontrar un nombre de cookie csrftoken allí.

Si aún tiene problemas, verifique dos veces la tupla de middleware en su settings.py y verifique que su navegador acepte el cocinero de su servidor como se describe anteriormente.

Borra la memoria caché de tu navegador y vuelve a intentarlo. Tal vez esté utilizando el token CSRF guardado en una cookie almacenada en caché.

Con la adición de la respuesta anterior, intente agregar las siguientes líneas en las vistas

 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def somathing(): return something