15

我刚刚将我的 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 %}

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

4

4 回答 4

9

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

  • 先清除浏览器数据再试
  • 提交的 csrfmiddlewaretoken 值是多少
  • 你导入正确的 Django 吗?
  • 只需确保控制台中是否有 UserWarning 之类的?:“在模板中使用了 {% csrf_token %},但上下文未提供该值。这通常是由于未使用 RequestContext 造成的。”
于 2012-04-07T03:05:50.290 回答
3
  1. 对于 1.3 和 1.4,“django.middleware.csrf.CsrfResponseMiddleware”应命名为“django.middleware.csrf.CsrfViewMiddleware”
  2. 此外,对我来说,清除谷歌浏览器的 cookie 使其工作。
于 2012-08-19T03:43:39.637 回答
0

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

于 2017-02-05T13:32:02.063 回答
0

清除浏览器或 Google Chrome cookie,我希望它会起作用。

于 2020-12-07T19:09:07.813 回答