django 的零星 403 "CSRF FAILURECSRF cookie not set"错误



我们有一个刚刚开始对外开放的小网站。在大多数情况下,它运行得很好,但我们偶尔会收到403个错误,其中一个表单显示消息"CSRF FAILURECSRF cookie未设置"。表单中肯定包含了{% 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不匹配,我认为这是造成问题的原因,但我不知道这些是如何对某些提交而不是其他提交不同步的。页面是一个非常简单的表单,只有几个字段。

关于我应该去哪里找,有什么建议吗?我正在通过apache使用mod_wsgi在CentOS上运行最新的Django 1.4.1。

编辑:与成功的请求相比,唯一奇怪的是这里的COOKIES:{}部分是空的,这会让我怀疑他们可能只是在浏览器中禁用了COOKIE,但为什么它会在META部分显示CSRF_COOKIE?

谢谢你的帮助!

Brandon

HTTP_COOKIE也为空吗?

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

最新更新