【问题标题】:Django: CSRF token missing or incorrect. / avoid {% csrf_token %}Django:CSRF 令牌丢失或不正确。 / 避免 {% csrf_token %}
【发布时间】:2014-07-12 08:32:15
【问题描述】:

我正在关注关于 Show me to do 的 Django 指南。但我有一个问题:

如果我只是复制他的代码,我会生成一个

禁止 (403) CSRF 验证失败。请求中止。

我已经通过添加解决了这个问题

context_instance=RequestContext(request)

对所有“我的”返回 render_to_response 并将标签 {% csrf_token %} 添加到我正在调用的表单中。

问题来了:我可以以任何方式将其设置为“在幕后”调用,还是必须将其添加到我的所有表单中?

【问题讨论】:

    标签: python django


    【解决方案1】:

    CSRF 是一个重要的安全概念 AFAIK。

    您必须为所有使用 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 .但我建议不要这样做。

    【讨论】:

    • 谢谢。但是对于您链接到的示例,我仍然必须在每次调用中做一些事情是不是可以定义我自己的 render_to_response ,只需在调用中添加 context_instance=RequestContext(request) ?
    • 我认为没有后端解决方案,因为它也依赖于客户端以及 AFAIK。 CSRF 检查由django.middleware.csrf.CsrfViewMiddleware 处理,看看你是否可以扩展它以按照你的方式工作。
    【解决方案2】:

    是的,您可以使用render(request, template, context) 而不是render_to_responserender 快捷方式自动使用 RequestContext。

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 2013-01-12
      • 2018-10-23
      • 2017-09-09
      • 2011-08-20
      • 2011-12-26
      • 2014-03-29
      • 1970-01-01
      • 2021-07-14
      相关资源
      最近更新 更多