我们有一个刚刚开始向外界开放的小网站。在大多数情况下,它运行良好,但我们偶尔会收到来自其中一种表单的消息“CSRF FAILURECSRF cookie not set”的 403 错误。表单肯定{% 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,但是为什么它会出现在 CSRF_COOKIE 中元部分?
谢谢你的帮助!
布兰登