2012-08-29 20 views
6

Robię aplikację z formularza logowania, ale gdy używam mojej aplikacji i kliknij przycisk logowania następujący błąd wystąpiForbidden (403) Weryfikacja CSRF nie powiodła się. Żądanie przerwane

zabronione (403) weryfikacja CSRF nie powiodło się. Żądanie zostało przerwane.

kod view.py jest jako:

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

Odpowiedz

16

Trzeba dodać {% csrf_token %} w formularzu

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

tak:

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

także musisz użyć RequestContext (request) eve rytime użyć render_to_response:

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

I trzeba importować uwierzytelniania i zalogować:

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

w ** home.html ** lub ** login.html ** lub ** zarówno ** – user786

+0

To zależy, gdzie jest Twoja forma ? – BlueMagma

+0

ok, dodałem go, ale wciąż otrzymuję błąd. Czy muszę coś importować ??? – user786

2

I napotkał ten problem podczas korzystania z książki "The Definitive Guide do Django", w którym jest używany w wersji 1.1. Książka nie uwzględnia potrzeby weryfikacji csrf_token, która jest wymagana w późniejszych wersjach.

Aby rozwiązać ten problem, należy dodać:

from django.template import RequestContext 

do pliku views.py i tym dodatkiem argumentu dla funkcji render_to_response:

context_instance = RequestContext(request) 

należy dodać {% csrf_token %} ciągu <form> znaczników w szablon

3

Tylko komentarz 'django.middleware.csrf.CsrfViewMiddleware'

w settings.py, który pracuje dla mnie:

//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', 
] 
Powiązane problemy