Django - CSRF 令牌丢失或不正确

Posted

技术标签:

【中文标题】Django - CSRF 令牌丢失或不正确【英文标题】:Django - CSRF token missing or incorrect 【发布时间】:2012-04-20 12:21:02 【问题描述】:

我刚刚将我的 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',
)

登录.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 %

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

【问题讨论】:

【参考方案1】:

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

先清除浏览器数据再试 提交的csrfmiddlewaretoken值是多少 您是否导入了正确的 Django? 只要确定一下,控制台中是否有 UserWarning 之类的?:“在模板中使用了 % csrf_token %,但上下文没有提供值。这通常是由于未使用 RequestContext 造成的。”

【讨论】:

【参考方案2】:
    对于 1.3 和 1.4,“django.middleware.csrf.CsrfResponseMiddleware”应命名为“django.middleware.csrf.CsrfViewMiddleware” 另外,对我来说,清除谷歌浏览器的 cookie 使其工作。

【讨论】:

【参考方案3】:

我的应用部署在 HTTPS 上时遇到了类似的问题。我必须将设置标志 CSRF_COOKIE_HTTPONLY 更改为 false,以便客户端服务器可以访问 csrf cookie。

【讨论】:

【参考方案4】:

清除浏览器或谷歌浏览器cookies,我希望它会工作。

【讨论】:

以上是关于Django - CSRF 令牌丢失或不正确的主要内容,如果未能解决你的问题,请参考以下文章

CSRF 令牌丢失或不正确。 Django + AngularJS

Django - 403 禁止。 CSRF 令牌丢失或不正确

Django:CSRF 令牌丢失或不正确。 / 避免 % csrf_token %

Django 表单中的 CSRF 令牌丢失或不正确

Unity Web Request + Django:CSRF 令牌丢失或不正确

禁止(CSRF 令牌丢失或不正确。)Django