【问题标题】:Django fails to catch/handle csrf tokenDjango 无法捕获/处理 csrf 令牌
【发布时间】:2015-10-06 00:56:19
【问题描述】:

我有一个以前可以使用的页面,遗憾的是我没有最近的备份,因此我可以返回到该页面的最新工作版本。

我有一个页面,它使用 allauth 来处理创建和登录用户的页面。但是,现在当我填写表单以注册或登录用户时,我得到一个403 error,说CSRF verification failed. Request aborted

我已经检查了页面的 cookie,并且有一个 csrf token 存在。我尝试删除它并重新加载页面。再次重新创建了 cookie,但仍然是同样的错误。登录admin 页面也会出现同样的错误,我只能假设任何其他带有form 的页面。

我在我的设置文件中包含了django.middleware.csrf.CsrfViewMiddleware,所以我不知道是什么导致了这个错误。

我的settings.py

import os, djcelery
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = censored...
DEBUG = False
ALLOWED_HOSTS = ['0.0.0.0', '127.0.0.1', 'localhost']

# Application definition
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.sites',
    'django.contrib.staticfiles',
    'interface',
    'chemrun',
    'kombu.transport.django',
    'chemicalizer.tasks',
    'json',
    'django_nvd3',
    'djangobower',
    'allauth',
    'allauth.account',
    'djangosecure',
)

MIDDLEWARE_CLASSES = (
    'djangosecure.middleware.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)   

ROOT_URLCONF = 'chemicalizer.urls'

TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': ['interface'],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.i18n',
            'django.template.context_processors.media',
            'django.template.context_processors.static',
            'django.template.context_processors.tz',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
    },
]  

【问题讨论】:

  • 你能添加发生这种情况的模板/视图吗?
  • 我使用allauth,所以它是标准的模板和视图。我没改过。

标签: python django csrf django-allauth


【解决方案1】:

看起来您的代码没有发回 CSRF 令牌。需要添加到header中。

【讨论】:

  • 我该怎么做?我还是 Django 的新手,所以详细的描述非常有帮助:)
  • CSRF 是一个很简单的东西。服务器向它的客户端发送一个令牌,并在下一个请求时客户端将它发送回来。 CSRF 令牌通过页头发送。如果您的服务器抱怨 CSRF 令牌,这意味着它丢失(未发送)或不同(可能是服务器配置问题)。
  • 由于我可以在浏览器中看到 cookie,我认为它足以表明它已发送,但由于配置问题,服务器不知何故无法识别它。你知道我可能会寻找什么问题吗?
  • 这个 cookie 需要在下一个请求中作为 X-CSRFToken 标头发回。您可以在 Chrome -> Developer Tools -> Network -> File -> Headers 中检查它的存在。请注意,此 cookie 会随着服务器的每次响应而变化。你检查过这个文档吗?信息量很大:docs.djangoproject.com/en/1.8/ref/csrf
  • 它查看了标题,X-Frame-Options 出于某种原因被设置为DENY。这可能会导致问题吗?我认为它应该设置为SAMEORIGIN,但我不知道可以/应该在哪里完成。我确实通读了该页面,但对我来说似乎有点过于技术化。至少我找不到我的错误是什么,因为我觉得我所做的事情与他们列出的完全一样......我显然不能拥有或至少拥有一些额外的东西来搞砸事情。
猜你喜欢
  • 2013-05-05
  • 2021-02-19
  • 2016-04-05
  • 2019-02-26
  • 1970-01-01
  • 2015-05-21
  • 2013-08-11
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多