使用 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的。



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

  1. Web框架之Django重要组件(Django中间件、csrf跨站请求伪造)

    Web框架之Django_09 重要组件(Django中间件.csrf跨站请求伪造)   摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是 ...

  2. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

  3. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  4. Django model 中的 class Meta 详解

    Django model 中的 class Meta 详解 通过一个内嵌类 "class Meta" 给你的 model 定义元数据, 类似下面这样: class Foo(mode ...

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

    不多说,直接上干货! 成功!  关于Ubuntu的网络设置.静态IP设置,见 Ubuntukylin-14.04-desktop( 不带分区)安装步骤详解 Ubuntukylin-14.04-desk ...

  6. 使用openURL实现程序间带参数跳转详解

    使用openURL实现程序间带参数跳转详解 实现的效果:有两款应用A与B,A打开B A --> B 1. 新建工程B,bundle ID为com.YouXianMing.B 建立一个URL 这么 ...

  7. Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)

    摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...

  8. Django 框架篇(四) : 视图(view)详解 以及 路由系统(url)

    |--Django的View(视图) |-- CBV和FBV: |-- 给视图增加装饰器: |-- request对象: |-- response对象: |-- Django的路由系统(url): | ...

  9. vue构造函数(根实例化时和组件实例对象选项)参数:选项详解

    实例选项(即传给构造函数的options):数据,DOM,生命周期钩子函数,资源,组合,其他 数据 data 属性能够响应数据变化,当这些数据改变时,视图会进行重渲染. 访问方式: 1.通过 vm.$ ...

随机推荐

  1. Http工作过程

    一次HTTP操作称为一个事务,其工作整个过程如下: 1 ) .地址解析, 如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm 从中分解出协议名.主机名 ...

  2. Git学习笔记(二)分支管理与合并及Bug分支

    一.分支管理 1.什么是分支 分支就相当于我们看科幻片里的平行宇宙,如果两个平行宇宙互不干扰,那铁定是啥事儿没有.不过,在某个时间点,两个平行宇宙合并了呢?假如两个宇宙中都有你的影子, 合并之后相当于 ...

  3. Solaris11 How-To

    允许root用户使用ftp - 修改/etc/ftpd/ftpusers文件,移除或注释掉"root" - 修改/etc/proftpd.conf文件,"RootLogi ...

  4. 初识DDD

    DDD强调专注于业务问题域的需要:其专业术语.为何开发该软件的关键原因,以及对于业务来说什么才是成功 问题域涉及你当前正在构建软件的主题领域 DDD强调的是,在致力于为大型复杂业务系统创建软件时,专注 ...

  5. DAY5-常用模块

    一 time与datetime模块 二.random模块 三.os模块 四.sys模块 五 shutil模块 六 json&pickle模块 七 shelve模块 八 xml模块 九 conf ...

  6. 0016_练习题d2

    __author__ = 'qq593' #!/usr/bin/env python #-*- coding:utf-8 -*- #元素分类,有如下值集合[11,22,33,44,55,66,77,8 ...

  7. Arduino Uno 在win7 64位下的驱动问题

    1.解压[mdmcpq.inf_amd64_neutral_fbc4a14a6a13d0c8.rar],将[mdmcpq.inf_amd64_neutral_fbc4a14a6a13d0c8]文件夹复 ...

  8. JavaScript问题01 js代码放在header和body的区别

    1 body和header中JavaScript执行的时机 1.1 header中 放在header中的javascript代码会进行预加载(即:在页面加载之前就会进行),所以需调用才执行的脚本或事件 ...

  9. 11.树形Model/View实例

    任务1:显示如图的树形结构 思考: 1.使用QTreeView显示. 2.Model使用QStandardItemModel,qt的一个标准model. 3.QStandardItemModel下每一 ...

  10. CodeForces 384E Propagating tree (线段树+dfs)

    题意:题意很简单么,给定n个点,m个询问的无向树(1为根),每个点的权值,有两种操作, 第一种:1 x v,表示把 x 结点加上v,然后把 x 的的子结点加上 -v,再把 x 的子结点的子结点加上 - ...