2012-04-07 11 views
11

Tôi vừa cập nhật django của mình lên 1.4. Nhưng tôi nhận được lỗi sau khi tôi cố gắng gửi biểu mẫu đăng nhập của mình:Mã thông báo Django - CSRF bị thiếu hoặc không chính xác

Bị cấm (403) Xác minh CSRF không thành công. Yêu cầu bị hủy. Lý do được đưa ra cho sự thất bại: Mã thông báo CSRF bị thiếu hoặc không chính xác.

Trong settings.py của tôi (MIDDLEWARE_CLASSES) Tôi đã phải loại bỏ các dòng sau vì nó bây giờ bị phản đối:

'django.middleware.csrf.CsrfResponseMiddleware', 

Và hơn tôi bắt đầu để có được lỗi này.

Một số thông tin cần thiết: 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 %} 

Có ai biết làm thế nào để giải quyết vấn đề này?

Trả lời

7

Mã có vẻ tốt, Django 1.3 và 1.4 auth.views.login sử dụng RequestContext chính xác. Vui lòng kiểm tra:

  • dữ liệu Thứ nhất rõ ràng về trình duyệt và thử lại
  • Có gì giá trị của trình csrfmiddlewaretoken
  • Bạn nhập đúng Django?
  • Chỉ cần đảm bảo, có UserWarning trong bảng điều khiển như không ?: "A {% csrf_token%} đã được sử dụng trong mẫu, nhưng ngữ cảnh không cung cấp giá trị. Điều này thường do không sử dụng RequestContext."
+2

Xóa dữ liệu của trình duyệt giải quyết cho tôi. – chaim

3
  1. Đối với 1.3 và 1.4, "django.middleware.csrf.CsrfResponseMiddleware" nên được đặt tên là "django.middleware.csrf.CsrfViewMiddleware"
  2. Ngoài ra, đối với tôi xoá cookie của Google Chrome đã làm cho nó làm việc.
0

Tôi gặp sự cố tương tự khi ứng dụng của tôi được triển khai trên HTTPS. Tôi đã phải thay đổi thiết lập cờ CSRF_COOKIE_HTTPONLY thành sai để máy khách có thể truy cập cookie csrf.