zoukankan      html  css  js  c++  java
  • 对于rest_framework,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函数渲染视图
    4. 而rest framework框架是写前后端分离的项目,返回的结果是用Response返回的,所以django自带的csrf组件不生效,所以使用rest framework的认证组件进行token的认证,这就解释了我的迷惑,为什么rest 框架的请求生命周期中是要经过django的中间件的,也是要经过django的csrf组件的,为什么我们自己还要编写认证组件,干嘛不用django的。

  • 相关阅读:
    数据可视化之powerBI技巧(三)这个Power BI技巧很可爱:利用DAX制作时钟
    数据可视化之powerBI技巧(二)Power BI性能分析器,原来还有这个功能
    数据可视化之powerBI技巧(一)PowerBI可视化技巧:KPI指标动态展示之TOPN及其他
    李航统计学习方法(第二版)(十二):最大熵模型
    李航统计学习方法(第二版)(十一):逻辑斯谛回归
    李航统计学习方法(第二版)(十):决策树CART算法
    李航统计学习方法(第二版)(九):决策树简介
    Java 实例 – 在指定目录中查找文件
    input type=”reset” (Elements) – HTML 中文开发手册
    HTML data-, 属性
  • 原文地址:https://www.cnblogs.com/python001-vip/p/12676333.html
Copyright © 2011-2022 走看看