2012-08-29 22 views
6

Ich mache eine App von Login-Formular, aber wenn ich meine app leite und klicken Sie auf Login-Button wird der folgende FehlerVerboten (403) CSRF-Überprüfung fehlgeschlagen. Anfrage abgebrochen

Forbidden (403) CSRF Überprüfung fehlgeschlagen auftreten. Anfrage abgebrochen.

der Code von view.py ist als:

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

Antwort

16

Sie benötigen {% csrf_token %} in Ihrem Formular

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

so hinzuzufügen:

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

Auch Sie müssen RequestContext (Anfrage) eve verwenden rytime Sie verwenden render_to_response:

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

Und Sie beglaubigen importieren müssen und Anmeldung:

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

in ** home.html ** oder ** login.html ** oder ** ** beide – user786

+0

Es hängt, wo ist deine Form ? – BlueMagma

+0

ok, ich habe es hinzugefügt, aber immer noch den Fehler bekommen. Wo muss ich etwas importieren ??? – user786

2

ich dieses Problem aufgetreten, während das Buch mit "The Definitive Guide to Django", bei der Version 1.1 verwendet wird. Das Buch behandelt nicht die Notwendigkeit der csrf_token Verifizierung, die in späteren Versionen vorgeschrieben ist.

um dieses Problem zu beheben, fügen:

from django.template import RequestContext 

zum views.py Datei und dieses zusätzliche Argument für die render_to_response Funktion:

context_instance = RequestContext(request) 

Seien Sie sicher, {% csrf_token %} innerhalb der <form> Tags hinzuzufügen in die Vorlage

3

Nur Kommentar 'django.middleware.csrf.CsrfViewMiddleware'

in Ihrem settings.py, was für mich funktioniert:

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