【问题标题】:Django - CSRF token missing or incorrectDjango - CSRF 令牌丢失或不正确
【发布时间】: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 %}

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

【问题讨论】:

    标签: django django-authentication django-csrf


    【解决方案1】:

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

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

    【讨论】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2021-07-14
            • 2021-11-13
            • 2012-09-25
            • 1970-01-01
            • 1970-01-01
            • 2016-05-12
            • 2016-06-10
            • 2017-09-14
            • 2019-12-04
            相关资源
            最近更新 更多