Django - CSRF令牌丢失或不正确

时间:2012-04-07 01:33:54

标签: django django-authentication django-csrf

我刚刚将django更新为1.4。但是当我尝试提交登录表单时出现以下错误:

  

禁止(403)   CSRF验证失败。请求中止。   失败的原因:       CSRF令牌丢失或不正确。

在我的settings.py(MIDDLEWARE_CLASSES)中,我不得不删除以下行,因为它现已弃用:

'django.middleware.csrf.CsrfResponseMiddleware',

而且我开始得到这个错误。

一些必要的信息: 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 %}

有谁知道如何解决这个问题?

4 个答案:

答案 0 :(得分:7)

代码看起来很好,Django 1.3和1.4 auth.views.login正确使用RequestContext。请检查:

  • 首先清除浏览器数据并重试
  • 提交的csrfmiddlewaretoken
  • 的价值是多少
  • 你导入正确的Django吗?
  • 请确保在控制台中是否有UserWarning?:“模板中使用了{%csrf_token%},但上下文没有提供值。这通常是由于不使用RequestContext引起的。”

答案 1 :(得分:3)

  1. 对于1.3和1.4,“django.middleware.csrf.CsrfResponseMiddleware”应命名为“django.middleware.csrf.CsrfViewMiddleware”
  2. 另外,对我来说,清除Google Chrome的Cookie会让它发挥作用。

答案 2 :(得分:0)

我有类似的问题,我的应用程序部署在HTTPS上。我不得不将设置标志CSRF_COOKIE_HTTPONLY更改为false,以便客户端服务器可以访问csrf cookie。

答案 3 :(得分:0)

清除浏览器或Google Chrome cookie ,希望它能正常工作。