零星403"未设置CSRF FAILURECSRF cookie" django的错误

时间:2012-08-05 21:43:21

标签: django http-status-code-403 django-1.4 django-csrf

我们有一个刚刚开始暴露于外部世界的小网站。在大多数情况下,它工作得很好,但我们偶尔会从其中一个表单中收到403错误消息“CSRF FAILURECSRF cookie not set”。表单肯定包含{% csrf_token %},我们的中间件看起来像这样:

MIDDLEWARE_CLASSES = (
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

该表单适用于大多数人,但大约每天一次我会收到一封包含失败案例的电子邮件。电子邮件包含实际请求,看起来像这样(我删除了其余的POST数据以隐藏私人数据,但留下了csrfmiddlewaretoken):

<WSGIRequest
path:/main/10/apply/,
GET:<QueryDict: {}>,
POST:<QueryDict: {u'csrfmiddlewaretoken': [u'IQQZvbVIggJm6Be6VinPHj8Qn3i3TdmG']}>,
COOKIES:{},
META:{'CONTENT_LENGTH': '111978',
 'CONTENT_TYPE': 'multipart/form-data; boundary=----WebKitFormBoundaryLyo9BPXnAwKnt8ew',
 'CSRF_COOKIE': 'XmSPWJZk2UwS4PNBXRmVlAaYDDdNaGqk',

CSRF_COOKIE与csrfmiddlewaretoken不匹配,这是我假设导致问题的原因,但我无法弄清楚这些是如何与某些提交不同步而不是其他提交。该页面是一个非常简单的表单,只有几个字段。

有关我应该注意的地方的任何建议吗?我正在使用mod_wsgi通过apache在CentOS上运行最新的Django 1.4.1。

编辑:与成功请求相比,唯一看似奇怪的事情是,此处COOKIES:{}部分为空,这会让我怀疑他们可能只是禁用了Cookie在他们的浏览器中,但为什么它会出现在META部分的CSRF_COOKIE?

感谢您的帮助!

布兰登

1 个答案:

答案 0 :(得分:0)

HTTP_COOKIE也是空白吗?

可能是django在请求中没有看到CSRF令牌cookie,它正在生成 new CSRF_COOKIE并将其放入meta。