2012-04-07 18 views
11

Właśnie zaktualizowałem django do wersji 1.4. Ale pojawia się następujący błąd, gdy próbuję przesłać mój formularz logowania:Django - brakujący lub nieprawidłowy token CSRF

Forbidden (403) Weryfikacja CSRF nie powiodła się. Żądanie zostało przerwane. Powód podany w przypadku niepowodzenia: Brakujący lub nieprawidłowy token CSRF.

W moim settings.py (MIDDLEWARE_CLASSES) musiałem usunąć następującą linię, ponieważ jej teraz przestarzałe:

'django.middleware.csrf.CsrfResponseMiddleware', 

I niż zaczęłam aby uzyskać ten błąd.

Niektóre niezbędne informacje: Urls.py

url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'registration/login.html'}, name='login') 
MIDDLEWARE_CLASSES = (
    'django.middleware.gzip.GZipMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
# 'django.middleware.csrf.CsrfResponseMiddleware', 
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', 
) 

login.html

{% extends "base.html" %} 
{% block title %} Login {% endblock %} 
{% block content %} 



    <div id="text"> 
     <table> 
      <form action="" method="post"> 
      {% csrf_token %} 
      <tr> 
       <td><label for="username">Email:</label></td> 
       <td><input type="text" name="username" value="" id="username"></td> 
      </tr> 
      <tr> 
       <td><label for="password">Password:</label></td> 
       <td><input type="password" name="password" value="" id="password"></td> 
      </tr> 
      <tr> 
       <td><input type="submit" value="Login" /> 
      {% if next %} 
       <input type="hidden" name="next" value="{{ next }}" /></td> 
      {% else %} 
       <input type="hidden" name="next" value="/" /></td> 
      {% endif %} 
      </tr> 
      </form> 
     </table> 


     {% if form.errors %} 
     <p class="error">User or password incorrect</p> 
     {% endif %} 
    </div> 
{% endblock %} 

Czy ktoś wie jak rozwiązać ten problem?

Odpowiedz

7

Kod wygląda dobrze, Django 1.3 i 1.4 auth.views.login poprawnie używa RequestContext. Proszę sprawdzić:

  • pierwsze wyraźne dane przeglądarki i spróbuj ponownie
  • Co wartość składać csrfmiddlewaretoken
  • Czy importować poprawnego Django?
  • Po prostu upewnij się, czy w konsoli jest UserWarning ?: "W szablonie użyto elementu {% csrf_token%}, ale kontekst nie podał wartości, co zwykle spowodowane jest brakiem użycia RequestContext."
+2

Wyczyść dane przeglądarki rozwiązuje to dla mnie. – chaim

3
  1. 1,3 i 1,4 „django.middleware.csrf.CsrfResponseMiddleware” powinien zostać nazwany „django.middleware.csrf.CsrfViewMiddleware”
  2. Również dla mnie wyczyszczenie ciasteczek Google Chrome wykonany działać.
0

Miałem podobny problem, gdy moja aplikacja została wdrożona na HTTPS. Musiałem zmienić ustawienie flagi CSRF_COOKIE_HTTPONLY na false, aby serwer klienta mógł uzyskać dostęp do cookie csrf.