Django缓存导致CSRF违规

时间:2014-12-05 04:41:27

标签: django caching csrf

我的网站使用django-registration进行登录/注册。最近我介绍了一些缓存中间件,并在尝试背靠背新用户注册时导致CSRF违规。

以下是来自settings.py的中间件声明:

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'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.UpdateCacheMiddleware',          <------
'django.middleware.locale.LocaleMiddleware',
'linaro_django_pagination.middleware.PaginationMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',       <------
'djangobb_forum.middleware.LastLoginMiddleware',
'djangobb_forum.middleware.UsersOnline',
'djangobb_forum.middleware.TimezoneMiddleware',

不确定这是否是真正的问题。中间件语句的顺序是否重要?

似乎必须有一种方法让CSRF和Cache中间件共存。目前我删除了缓存中间件。

1 个答案:

答案 0 :(得分:1)

根据https://docs.djangoproject.com/en/1.8/topics/cache/#the-per-site-cache

设置缓存后,使用缓存的最简单方法是缓存整个网站。您需要添加&#39; django.middleware.cache.UpdateCacheMiddleware&#39;和&#39; django.middleware.cache.FetchFromCacheMiddleware&#39;到您的MIDDLEWARE_CLASSES设置,如下例所示:

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
)

请注意

不,这不是一个错字:“更新”中间件必须是列表中的第一个,而“获取”中间件必须是最后一个。详细信息有点模糊,但请参阅订单如果你想要完整的故事,可以在下面看MIDDLEWARE_CLASSES。

不确定这是否有帮助。