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批量修改文件后缀示例代码分享
Dec 24 Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 Python
python中sys.argv函数精简概括
Jul 08 Python
python3正则提取字符串里的中文实例
Jan 31 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
python实时检测键盘输入函数的示例
Jul 17 Python
python opencv 实现对图像边缘扩充
Jan 19 Python
用Python生成HTML表格的方法示例
Mar 06 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 Python
python中tab键是什么意思
Jun 18 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 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
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
PHP7新功能总结
2019/04/14 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
html数组字符串拼接的最快方法
2009/09/16 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
javascript 窗口加载蒙板 内嵌网页内容
2010/11/19 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
详解nodejs 文本操作模块-fs模块(二)
2016/12/22 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
JS算法教程之字符串去重与字符串反转
2020/12/15 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
通用的Django注册功能模块实现方法
2021/02/05 Python
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
新西兰优惠网站:Treat Me
2019/07/04 全球购物
保密工作目标责任书
2014/07/28 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
大学生实习证明范本
2014/09/19 职场文书
年度考核表个人总结
2015/03/06 职场文书
2015年女工委工作总结
2015/07/27 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS