我一直在尝试在我的django 1.4.3网站上的POST表单上设置CSRF保护,并且一直没有设置403 CSRF cookie错误。
我相信我已经详细地遵循了文档,在许多论坛上遵循了建议,但都无济于事。我尽可能地删除了代码并且cookie没有设置。 csrfmiddlewaretoken存在,因此不是问题的根源。我的智慧结束了。毫无疑问,答案很简单,我只需要一双新鲜的眼睛向我指出......
所以这里有一些代码:
#urls.py
...
url(r'^csrf/$', csrf_test, name='csrf_test'),
...
#views.py
...
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def csrf_test(request):
c = {}
c.update(csrf(request))
return render_to_response('csrf.html', c)
...
<!-- csrf.html -->
<html>
<body>
<form action="" method="post">
{% csrf_token %}
<input name="Submit" value="Submit" type="submit"/>
</form>
</body>
</html>
#settings.py
...
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',
#for db transactions. Check middleware order if faulty
'django.middleware.transaction.TransactionMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
)
...
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'django.core.context_processors.csrf',
'django.core.context_processors.request',
)
...
我在127.0.0.1:8000上运行django开发服务器。
我在浏览器上启用了Cookie,并且已经确认其他网站正在设置Cookie。
我已经检查过csrfmiddlewaretoken是作为POST变量传递的。
我总是得到错误,这不是间歇性的。
当我禁用中间件/使用@csrf_exempt时,我对POST表单没有任何问题。
正如我所说,我的智慧结束了。究竟我错过了什么?
由于
森
编辑:
它现在有效,但我不知道发生了什么变化。对于将来阅读此内容的人,我创建了一个新项目和应用程序,它立即创建了cookie。认为它一定是设置问题我通过在'django.contrib.sessions.middleware.SessionMiddleware'下面移动'django.middleware.csrf.CsrfViewMiddleware'来改变我的MIDDLEWARE_CLASSES条目的顺序。我运行了原始的应用程序,它工作。但是,为了测试设置更改是否有责任,我推翻了更改。它仍然奏效。去图。
我希望这有助于未来FWIW。
森
答案 0 :(得分:1)
如果你正在使用render_to_response,那么你应该使用RequestContext
这将为您处理csrf保护 -
def csrf_test(request):
render_to_response('csrf.html', context_instance=RequestContext(request))
您不需要包含csrf_protect
装饰器,因为您已经拥有了csrf中间件。
答案 1 :(得分:1)
def csrf_test(request):
.....
return render(request, 'csrf.html', { ..... })