Django:缺少或不正确的CSRF令牌 / 避免使用{% csrf_token %}
我正在按照Django的指南进行操作,但我有个问题:
如果我直接复制他的代码,就会出现
禁止访问(403)
CSRF验证失败。请求被中止。
我通过在所有“我的”返回render_to_response的地方添加
context_instance=RequestContext(request)
以及在我调用的表单中添加标签{% csrf_token %}来解决了这个问题。
接下来我想问的是:有没有办法让这个设置在“后台”自动执行,还是说我必须在所有表单中都添加这个?
2 个回答
0
CSRF是一个很重要的安全概念,至少我知道是这样的。
你需要在所有使用POST、PUT或DELETE请求的表单中设置csrf_token
(这会设置一个隐藏的POST参数),或者你也可以使用X-CSRFToken
这个头信息。你可以使用render
这个快捷方式,而不是render_to_response
,这样默认就会包含RequestContext
。具体可以参考:
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
还有一种方法可以完全避免CSRF检查,就是去掉middleware
或者使用decorator
。不过我不建议这样做。
1
是的,你可以使用 render(request, template, context)
这个方法,而不是 render_to_response
。使用 render
这个快捷方式时,它会自动使用一个叫做 RequestContext 的东西。