2012-08-29 18 views
6

sto facendo un app di form di login, ma quando sto facendo funzionare la mia applicazione e fare clic sul pulsante di accesso si verificherà il seguente erroreVerifica CSRF vietata (403) non riuscita. Richiesta interrotta

Proibita (403) CSRF verifica non è riuscita. Richiesta interrotta.

il codice di view.py è come:

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)) 

risposta

16

è necessario aggiungere {% csrf_token %} nel modulo

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

così:

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

Inoltre, devi usare RequestContext (request) eve rytime si utilizza render_to_response:

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

e si deve importare autenticazione e login:

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

in ** ** home.html o ** login.html ** o ** entrambi ** – user786

+0

Dipende, dove è il tuo modulo? – BlueMagma

+0

ok, l'ho aggiunto ma ho ancora ricevuto l'errore. Dovrei importare qualcosa ??? – user786

2

ho incontrato questo problema durante l'utilizzo del libro "La guida definitiva a Django", in cui viene utilizzata la versione 1.1. Il libro non affronta la necessità della verifica csrf_token che è obbligatoria nelle versioni successive.

Per risolvere questo problema, aggiungere:

from django.template import RequestContext 

al file views.py e questo argomento aggiunto per la funzione render_to_response:

context_instance = RequestContext(request) 

Assicurarsi di aggiungere {% csrf_token %} all'interno dei tag in <form> il modello

3

Solo commento 'django.middleware.csrf.CsrfViewMiddleware'

nel vostro settings.py, che lavora per me:

//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', 
]