Django:缺少或不正确的CSRF令牌 / 避免使用{% csrf_token %}

1 投票
2 回答
866 浏览
提问于 2025-04-18 07:22

我正在按照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 的东西。

撰写回答