Django - 带CSRF令牌的Bug(CSRF验证失败。请求中止)

时间:2017-04-27 14:14:05

标签: django python-3.x debugging csrf

我在Django支持的网站上遇到了csrf令牌的问题,我很接近将其报告为错误。

问题基本上是,当DEBUGFalse时,CSRF令牌失败。当DEBUGFalse时,如果我正在使用csrf令牌的会话(Django 1.11):

CSRF_USE_SESSIONS = True
CSRF_COOKIE_AGE = None

...前端的所有表单/发布请求都失败了身份验证,但我可以正常登录Django管理面板,例如,csrf令牌身份验证成功。

另一方面,如果我正在为csrf使用cookie,那么对表单/帖子请求的前端进行身份验证时没有任何问题,但是对于管理员登录失败了:CSRF verification failed. Request aborted.

我的settings.py文件的一部分如下所示:

SECRET_KEY = os.getenv('DJANGO_SECRET_KEY')

DEBUG = 'DEBUG' in os.environ

# CSRF
# These are commented/uncommented depending on what method I'm testing
# CSRF_USE_SESSIONS = True
# CSRF_COOKIE_AGE = None

# I added the cookie domain setting after I started seeing the problem
# and hoped it would have resolved it; it didn't help.
CSRF_COOKIE_DOMAIN = '.{0}'.format(os.getenv('DOMAIN_NAME', 'mysite.com'))

ALLOWED_HOSTS = [
    '.mysite.com',
    '.mysite.info',
]

if DEBUG:
    ALLOWED_HOSTS.extend(['.mysite.dev'])

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mainsite',
    'constance',
    'jstemplate',
    'compressor',
]

MIDDLEWARE = [
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.gzip.GZipMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
    'mainsite.middleware.Guid',
    'mainsite.middleware.SiteLang',
]

如果我将DEBUG设置为True,我在前端和登录Django管理面板时都没有任何CSRF令牌身份验证问题。

我也使用Redis作为缓存。我错过了导致此CSRF错误的重要事项吗?我必须指出,有一点我没有得到这个错误,但我不能在我的生活中找出使用CSRF令牌产生这种行为的改变。

1 个答案:

答案 0 :(得分:0)

我也有同样的问题 我解决了这个问题 1. pip install django-sslserver
2.将sslserver放入INSTALLED_APPS 3. python manage.py runsslserver