2012-08-29 54 views
6

estoy haciendo una aplicación de formulario de acceso, pero cuando estoy corriendo mi aplicación y haga clic en el botón de inicio de sesión el siguiente error se produciráProhibido (403) Falló la verificación de CSRF. Solicitud abortado

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

el código de view.py es como:

from django.template import loader 
from django.shortcuts import render_to_response 
from registration.models import Registration 
from django.http import HttpResponse 
from django.template import RequestContext 
from django.shortcuts import redirect 


def view_login(request,registration_id): 
    t = loader.get_template('registration/login.html') 
    try: 
     registration=Registration.objects.get(pk=registration_id) 
    except Registration.DoesNotExist: 
     return render_to_response("login.html",{"registration_id":registration_id}) 

def home(request,registration_id): 
    if request.method == "POST": 
     username = request.POST.get('user_name') 
     password = request.POST.get('password') 
     user = authenticate(username=username, password=password) 
     if user is not None: 
     if user.is_active: 
      login(request, user) 
     # success 
      return render('registration/main_page.html',{'registration_id':registration_id},context_instance=RequestContext(user)) 
     else: 
     #user was not active 
      return redirect('q/',context_instance=RequestContext(user)) 
     else: 
     # not a valid user 
      return redirect('q/',context_instance=RequestContext(user)) 
    else: 
     # URL was accessed directly 
      return redirect('q/',context_instance=RequestContext(user)) 

Respuesta

16

es necesario agregar {% csrf_token %} en su forma

https://docs.djangoproject.com/en/1.4/ref/contrib/csrf/

así:

<form> 
    {% csrf_token %} 
    <anything_else> 
</form> 

Además, tienes que usar RequestContext (solicitud) rytime utiliza render_to_response:

return render_to_response("login.html", 
    {"registration_id":registration_id}, 
    context_instance=RequestContext(request)) 

Y hay que importar autenticar y acceder:

from django.contrib.auth import authenticate, login 
+0

en ** ** o ** home.html login.html ** o ** ** – user786

+0

tanto él depende, en donde es su formulario ? – BlueMagma

+0

bien, lo agregué pero sigo recibiendo el error. ¿Wheather tengo que importar algo? – user786

2

me encontré con este problema al utilizar el libro "La guía definitiva para Django" en donde se utiliza la versión 1.1. El libro no aborda la necesidad de la verificación csrf_token que es obligatorio en versiones posteriores.

Para solucionar este problema, agregue:

from django.template import RequestContext 

al archivo views.py y esto se agregó un argumento para la función render_to_response:

context_instance = RequestContext(request) 

Asegúrese de añadir {% csrf_token %} dentro de las etiquetas en <form> la plantilla

3

Solo comentar 'django.middleware.csrf.CsrfViewMiddleware'

en su settings.py, que funciona para mí:

//settings.py 
MIDDLEWARE = [ 
'django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
#'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 
Cuestiones relacionadas