rest framework认证组件和django自带csrf组件区别详解

使用 Django 中的 csrf 处理

Django中有一个django.middleware.csrf.CsrfViewMiddleware中间件提供了全局的csrf检查。它的原理是在<form>标签中生成一个隐藏的<input>标签,提交表单时将这个隐藏的<input>一起提交,服务器端验证这个字段是否正确。

官方给出的csrf的操作步骤是:

  1. MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddleware,开启全局csrf保护。
  2. 对于POST至站内的表单,在模板中的<form>标签内添加{% csrf_token %}模板标签。
  3. 在对应的视图函数中确保使用django.template.context_processors.csrfContext处理器。实现方式有两种:
    (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组件生效,要满足以上三个条件
  1. MIDDLEWARE_CLASSES中添加django.middleware.csrf.CsrfViewMiddleware,开启全局csrf保护。
  2. 对于POST至站内的表单,在模板中的<form>标签内添加{% csrf_token %}模板标签。
  3. 用render函数渲染视图

而rest framework框架是写前后端分离的项目,返回的结果是用Response返回的,所以django自带的csrf组件不生效,所以使用rest framework的认证组件进行token的认证,这就解释了我的迷惑,为什么rest 框架的请求生命周期中是要经过django的中间件的,也是要经过django的csrf组件的,为什么我们自己还要编写认证组件,干嘛不用django的。



原文地址:https://www.cnblogs.com/lifei01/p/10733511.html

时间: 2024-08-30 04:48:51

rest framework认证组件和django自带csrf组件区别详解的相关文章

自定义频率组件,django自带的组件,解析器

自定义频率组件 from rest_framework.throttling import BaseThrottle, SimpleRateThrottle import time # 设置一分钟只能访问三次 class MyThrottle(BaseThrottle): visitor_dic = {} def __init__(self): self.history = None def allow_request(self, request, view): # META:请求所有的东西的字

python web开发-flask中url带斜线/和不带斜线/的区别详解

flask中带斜线和不带斜线的url 通过flask进行路由配置的时候,有一个细节,就是同样的url,带上"/"和不带"/"有什么区别. 举例说明: 比如有个url,名字为"/url" 先同时定义两种url,一种带"/",一种不带"/",如下代码: @app.route("/url")def urlWithOut():return "url with out /" @

Django文件上传机制用法详解(转)

Django文件上传机制用法详解 http://www.jbxue.com/article/24283.html 分享下Django文件上传机制的用法,包括基本上传文件的原理,以及如何处理上传文件的方法,需要的朋友参考下. 当Django处理上传一个文件时,文件数据被放在request.FILES中. 这个文档解释文件怎么样被存储在磁盘上或者内存中,怎样定制默认的行为. 一,基本文件上传考虑一个包含FileField的简单的表单: 复制代码 代码示例: from  django  import 

AME_Thoy_Oracle自带AME审批链详解AME Standard Handler

Oracle 自带了3大类,13个子类的审批链Action Type, 对应了13个标准的AME Standard Handler 1. 按主管层次审批 absolute job level / chains of authority based on absolute job levelfinal approver only / chains of authority containing only the final job-level approvermanager then final

AME_Oracle自带AME审批链详解AME Standard Handler(概念)

Oracle 自带了3大类,13个子类的审批链Action Type, 对应了13个标准的AME Standard Handler 1. 按主管层次审批 absolute job level / chains of authority based on absolute job levelfinal approver only / chains of authority containing only the final job-level approvermanager then final

小编带您Volatile的详解

volatile关键字修饰的共享变量主要有两个特点:1.保证了不同线程访问的内存可见性 2.禁止重排序在说内存可见性和有序性之前,我们有必要看一下Java的内存模型(注意和JVM内存模型的区分)为什么要有java内存模型?首先我们知道内存访问和CPU指令在执行速度上相差非常大,完全不是一个数量级,为了使得java在各个平台上运行的差距减少,哪些搞处理器的大佬就在CPU上加了各种高速缓存,来减少内存操作和CPU指令的执行速度差距.而Java在java层面又进行了一波抽象,java内存模型将内存分为

JS组件系列——JsPlumb连线及相关效果详解

前言:之前项目里面用到了Web里面的拖拽流程图的技术JsPlumb,其实真不算难,不过项目里面用HTML做的一些类似flash的效果,感觉还不错,在此分享下. Jsplumb官网:https://jsplumbtoolkit.com GitHub:https://github.com/sporritt/jsplumb/ 一.效果图展示 1.从左边拖动元素到中间区域,然后连线 2.连线类型可以自定义:这里定义为直线.折线.曲线.实际项目中根据业务我们定义为分装线.分装支线.总装线等 3.鼠标拖动区

Ubuntu11.10 带图形安装步骤详解

成功!  关于Ubuntu的网络设置.静态IP设置,见 CenTOS6.5的静态IP设置:见  http://www.cnblogs.com/zlslch/p/5065577.html CentOS6.5(带图形安装)在使用过程中遇到的一些网络问题迷惑:见 http://www.cnblogs.com/zlslch/p/5826369.html Centos 6.5下的OPENJDK卸载和SUN的JDK安装.环境变量配置:见 http://www.cnblogs.com/zlslch/p/582

React Native组件、生命周期及属性传值props详解

创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { render (){ return <Text style={{fontSize:20,backgroundColor:'red'}}>Hello</Text> } } 第二种:通过ES5的方式创建 /** * 方式二:ES5 */ var HelloComponent= React.c