Django CSRF Coo​​kie未设置

时间:2013-02-13 07:38:30

标签: django csrf

我一直在尝试在我的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。

2 个答案:

答案 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', { ..... })