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之一个免费的实验室
Sep 14 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
Python操作redis和mongoDB的方法
Dec 19 Python
用python拟合等角螺线的实现示例
Dec 27 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
用Python提取PDF表格的方法
Apr 11 Python
PyQt5爬取12306车票信息程序的实现
May 14 Python
关于python类SortedList详解
Sep 04 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的五种设计模式
2012/09/05 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
我所理解的JavaScript中的this指向
2020/09/04 Javascript
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python脚本实现查找webshell的方法
2014/07/31 Python
python将ip地址转换成整数的方法
2015/03/17 Python
python实现12306火车票查询器
2017/04/20 Python
pycham查看程序执行的时间方法
2018/11/29 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
python 求一个列表中所有元素的乘积实例
2019/06/11 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
自考生毕业自我鉴定
2013/10/10 职场文书
大学生求职简历的自我评价
2013/10/14 职场文书
答谢会策划方案
2014/05/12 职场文书
师德师风的心得体会
2014/09/02 职场文书
公证委托书格式
2014/09/13 职场文书
公司离职证明范本
2014/10/17 职场文书
2014年领导班子工作总结
2014/12/11 职场文书
家长会欢迎词
2015/01/23 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
Dashboard管理Kubernetes集群与API访问配置
2022/04/01 Servers