rest framework认证组件和django自带csrf组件区别详解
使用 Django 中的 csrf 处理
Django中有一个django.middleware.csrf.CsrfViewMiddleware
中间件提供了全局的csrf检查。它的原理是在<form>
标签中生成一个隐藏的<input>
标签,提交表单时将这个隐藏的<input>
一起提交,服务器端验证这个字段是否正确。
官方给出的csrf的操作步骤是:
- 在
MIDDLEWARE_CLASSES
中添加django.middleware.csrf.CsrfViewMiddleware
,开启全局csrf保护。 - 对于POST至站内的表单,在模板中的
<form>
标签内添加{% csrf_token %}
模板标签。 - 在对应的视图函数中确保使用
django.template.context_processors.csrf
Context处理器。实现方式有两种:
(1). 使用RequestContext
或者直接使用通用视图,它们会自动将csrf_token
添加至模板上下文中。
return render_to_response("xxx.html", context_instance=RequestContext(request))
(2). 手工导入并使用处理器来生成CSRF token,并将它添加到模板上下文中。例如:
from django.shortcuts import render_to_response
from django.template.context_processors import csrf
def my_view(request):
c = {}
c.update(csrf(request))
# ... view code here
return render_to_response("a_template.html", c)
但是,手工导入麻烦而且会使代码变得难以维护,使用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保护。 - 对于POST至站内的表单,在模板中的
<form>
标签内添加{% csrf_token %}
模板标签。 - 用render函数渲染视图
而rest framework框架是写前后端分离的项目,返回的结果是用Response返回的,所以django自带的csrf组件不生效,所以使用rest framework的认证组件进行token的认证,这就解释了我的迷惑,为什么rest 框架的请求生命周期中是要经过django的中间件的,也是要经过django的csrf组件的,为什么我们自己还要编写认证组件,干嘛不用django的。
rest framework认证组件和django自带csrf组件区别详解的更多相关文章
- Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)
Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造) 摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...
- Django框架 之 ORM查询操作详解
Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- Django model 中的 class Meta 详解
Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...
- Ubuntu11.10 带图形安装步骤详解
不多说,直接上干货! 成功! 关于Ubuntu的网络设置.静态IP设置,见 Ubuntukylin-14.04-desktop( 不带分区)安装步骤详解 Ubuntukylin-14.04-desk ...
- 使用openURL实现程序间带参数跳转详解
使用openURL实现程序间带参数跳转详解 实现的效果:有两款应用A与B,A打开B A --> B 1. 新建工程B,bundle ID为com.YouXianMing.B 建立一个URL 这么 ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
- Django 框架篇(四) : 视图(view)详解 以及 路由系统(url)
|--Django的View(视图) |-- CBV和FBV: |-- 给视图增加装饰器: |-- request对象: |-- response对象: |-- Django的路由系统(url): | ...
- vue构造函数(根实例化时和组件实例对象选项)参数:选项详解
实例选项(即传给构造函数的options):数据,DOM,生命周期钩子函数,资源,组合,其他 数据 data 属性能够响应数据变化,当这些数据改变时,视图会进行重渲染. 访问方式: 1.通过 vm.$ ...
随机推荐
- rem怎么计算
px:相对长度单位.像素px是相对于显示器屏幕分辨率而言的 em:相对单位,继承父节点(层层继承,传递)基准点为父节点字体的大小,如果自身定义了font-size按自身来计算(浏览器默认字体是16px ...
- linux串口基本编程
Linux的串口表现为设备文件.Linux的串口设备文件命名一般为/dev/ttySn(n=0.1.2„„),若串口是USB扩展的,则串口设备文件命名多为/dev/ttyUSBn(n=0.1.2„„) ...
- 2011-12-14 调用cmd并获得输入输出+网络访问
System.Diagnostics.Process pro = new System.Diagnostics.Process(); pro.StartInfo.FileName = "cm ...
- Recovery of DISKGROUP in VXVM (ZT)
http://gurkulindia.com/main/2012/03/recovery-of-diskgroup-in-vxvm-veritas-volume-manager/# Since lon ...
- javascript——对象的概念——创建对象与销毁对象
一.创建对象 1.创建空对象 方式一: var o ={};o; //Object {} typeof(o); //"object" 方式二: var o=new Object() ...
- leetcode398
public class Solution { int[] nums; Random rnd; public Solution(int[] nums) { this.nums = nums; this ...
- Shell编程进阶 1.2 shell结构及执行
创建一个shell脚本 mkdir shell vim first.sh #!/bin/bash ##The first test shell script. ##Written by wangsha ...
- -bash : ** : command not found的问题解决(图文详解)
问题来源 我不小心,配置错了,少了个export和PATH没配对. source /etc/profile 之前一定要留心,否则出错让你后悔去! 问题导致现象1 问题导致现象2 解决办法 按e键, ...
- dp-矩阵连乘
参考:http://blog.csdn.net/liufeng_king/article/details/8497607 使用备忘录算法复杂度降至O(n^3) #include<stdio.h& ...
- struts2学习笔记(5)拦截器
继承AbstractInterceptor类,在类中完成拦截器的功能,只需实现intercept方法即可,提供了init()和destroy()的空实现 示例:显示执行action所用的时间 ①在sr ...