4

我已经阅读了几篇关于 Django 中的 csrf 保护的文章,包括Django 的文档,但我仍然对如何正确使用它感到困惑。

最清晰的部分是 HTML 部分,但 Python 部分有点令人困惑。

HTML

{% csrf_token %}表格内

Python

c = {}
c.update(csrf(request))

在显示和请求信息时,您需要以各种形式使用它,不是吗?


那么,如何将这个 csrf 保护包含在return render()? 这个对吗?

return render(request,'index.html',{'var':var_value})

或者我应该在Python 文档示例( )中包含c类似的地方。或者,如果它是正确的,它是否包含在var 中?return render_to_response("a_template.html", c)request


而且,当不需要使用 csrf 因为我没有任何形式时。这是否是将值返回到模板的正确形式?

return render(request,'index.html',{'var':var_value})

4

3 回答 3

3

使用render快捷方式的重点是它会自动运行所有上下文处理器。上下文处理器是有用的小功能,每次渲染模板时都会向模板上下文添加各种内容。并且有一个内置的上下文处理器已经为你添加了 CSRF 令牌。所以,如果你使用render,除了在模板中输出token之外别无他法。

于 2013-07-01T16:23:06.617 回答
0

据我所知,Django 有自己的用于 csrf 保护的中间件,可以透明地为您处理所有事情。只需包括{% csrf_token %}内部表格即可。CSRF 令牌对于 POST 请求是强制性的(除非您使用 @csrf_exempt 装饰器)。所以一个表格是:

<form action="." method="post">
{% csrf_token %}
 your input fields and submit button...
</form>

希望这可以帮助。

于 2013-07-01T16:11:01.463 回答
0

只要您在设置文件的 MIDDLEWARE_CLASSES 变量中列出了“django.middleware.csrf.CsrfViewMiddleware”,您的模板中就应该只有 {% csrf_token %} 。

文档中有更多有用的信息:https ://docs.djangoproject.com/en/dev/ref/contrib/csrf/

于 2013-07-01T16:14:51.250 回答