Django使用中间键实现csrf认证详解


Posted in Python onJuly 22, 2019

Django中的csrf认证实现的原理

调用 process_view 方法

检查视图是否被 @csrf_exempt (免除csrf认证)

- 去请求体或cookie中获取token

情况一(全站使用csrf认证,局部不想使用csrf认证)

MIDDLEWARE = [
            'django.middleware.security.SecurityMiddleware',
            'django.contrib.sessions.middleware.SessionMiddleware',
            'django.middleware.common.CommonMiddleware',
            'django.middleware.csrf.CsrfViewMiddleware', # 全站使用csrf认证
            'django.contrib.auth.middleware.AuthenticationMiddleware',
            'django.contrib.messages.middleware.MessageMiddleware',
            'django.middleware.clickjacking.XFrameOptionsMiddleware',
          ]

如果我想让某个请求不通过csrf认证可以这样做

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt # 该函数无需认证
def users(request):
  user_list = ['alex','oldboy']
  return HttpResponse(json.dumps((user_list)))

情况二(全站不使用csrf认证,局部想使用csrf认证)

MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  #'django.middleware.csrf.CsrfViewMiddleware', # 全站不使用csrf认证
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

如果我想让某个请求使用csrf认证可以这样做

from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_protect # 该函数需认证
def users(request):
  user_list = ['alex','oldboy']
  return HttpResponse(json.dumps((user_list)))

CBV小知识,csrf时需要使用

- @method_decorator(csrf_exempt)

- 在dispatch方法中(单独方法无效)

方式一

from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator
class StudentsView(View):
  
  @method_decorator(csrf_exempt)
  def dispatch(self, request, *args, **kwargs):
    return super(StudentsView,self).dispatch(request, *args, **kwargs)

  def get(self,request,*args,**kwargs):
    print('get方法')
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')

方式二

from django.views.decorators.csrf import csrf_exempt,csrf_protect
from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt,name='dispatch')
class StudentsView(View):

  def get(self,request,*args,**kwargs):
    print('get方法')
    return HttpResponse('GET')

  def post(self, request, *args, **kwargs):
    return HttpResponse('POST')

  def put(self, request, *args, **kwargs):
    return HttpResponse('PUT')

  def delete(self, request, *args, **kwargs):
    return HttpResponse('DELETE')

总结:

  • - 本质,基于反射来实现
  • - 流程:路由,view,dispatch(反射)
  • - 取消csrf认证(装饰器要加到dispatch方法上且method_decorator装饰)

扩展:

  • - csrf
    • - 基于中间件的process_view方法
    • - 装饰器给单独函数进行设置(认证或无需认证)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现的一个火车票转让信息采集器
Jul 09 Python
Python实现的数据结构与算法之双端队列详解
Apr 22 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
python add_argument()用法解析
Jan 29 Python
Python @property原理解析和用法实例
Feb 11 Python
使用python创建Excel工作簿及工作表过程图解
May 27 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
java关于string最常出现的面试题整理
Jan 18 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 Python
Python xlwings插入Excel图片的实现方法
Feb 26 Python
python Tcp协议发送和接收信息的例子
Jul 22 #Python
利用Python实现手机短信监控通知的方法
Jul 22 #Python
如何使用django的MTV开发模式返回一个网页
Jul 22 #Python
python3.7 sys模块的具体使用
Jul 22 #Python
使用 Python 处理 JSON 格式的数据
Jul 22 #Python
用python写一个定时提醒程序的实现代码
Jul 22 #Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 #Python
You might like
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
php扩展ZF――Validate扩展
2008/01/10 PHP
PHP 字符串正则替换函数preg_replace使用说明
2011/07/15 PHP
如何让搜索引擎抓取AJAX内容解决方案
2014/08/25 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
ajax 缓存 问题 requestheader
2010/08/01 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Angular实现svg和png图片下载实现
2019/05/05 Javascript
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
基于python 二维数组及画图的实例详解
2018/04/03 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
对Python函数设计规范详解
2019/07/19 Python
python3实现的zip格式压缩文件夹操作示例
2019/08/17 Python
python求绝对值的三种方法小结
2019/12/04 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
门卫班长岗位职责
2013/12/15 职场文书
房地产广告词大全
2014/03/19 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
贷款担保书范本
2015/09/22 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python