Django中有一个django.middleware.csrf.CsrfViewMiddleware
中间件提供了全局的csrf检查。它的原理是在<form>
标签中生成一个隐藏的<input>
标签,提交表单时将这个隐藏的<input>
一块儿提交,服务器端验证这个字段是否正确。html
官方给出的csrf的操做步骤是:django
MIDDLEWARE_CLASSES
中添加django.middleware.csrf.CsrfViewMiddleware
,开启全局csrf保护。<form>
标签内添加{% csrf_token %}
模板标签。django.template.context_processors.csrf
Context处理器。实现方式有两种:RequestContext
或者直接使用通用视图,它们会自动将csrf_token
添加至模板上下文中。可是,手工导入麻烦并且会使代码变得难以维护,使用RequestContext
也没好到哪去, 而且在Django 1.8 的文档中说明context_instance
1.8 以后会被废弃。
那咱们应该如何处理csrf_token
呢?其实,Django提供了一个快捷函数能够处理这个问题。
django.shortcuts.render
在内部设定context_instance
缺省是RequestContext
的一个实例。调用render
即可以自动将csrf_token
添加至上下文中。后端
网上有一些博客说能够在settings
中设置TEMPLATE_CONTEXT_PROCESSORS
实现全局的csrf_token
填充至上下文。
可是我实验后发现并很差使,若是有朋友知道缘由的话,还望告知。服务器
我在settings
中是这样设置的:框架
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'django.core.context_processors.csrf',
)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
自此了解到要想django自带的csrf组件生效,要知足以上三个条件
MIDDLEWARE_CLASSES
中添加django.middleware.csrf.CsrfViewMiddleware
,开启全局csrf保护。<form>
标签内添加{% csrf_token %}
模板标签。