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模块包中__init__.py文件功能分析
Jun 14 Python
Python 装饰器深入理解
Mar 16 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
python查看模块,对象的函数方法
Oct 16 Python
python无限生成不重复(字母,数字,字符)组合的方法
Dec 04 Python
对Python定时任务的启动和停止方法详解
Feb 19 Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
Python简单实现区域生长方式
Jan 16 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
Feb 25 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
Python自然语言处理之切分算法详解
Apr 25 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
CURL状态码列表(详细)
2013/06/27 PHP
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
javascript的offset、client、scroll使用方法详解
2012/12/25 Javascript
jquery简单的拖动效果实现原理及示例
2013/07/26 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
JS模拟键盘打字效果的方法
2015/08/05 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
Python线程中对join方法的运用的教程
2015/04/09 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
python两种注释用法的示例
2020/10/09 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
总经理岗位职责
2013/11/09 职场文书
实习生体会的自我评价范文
2013/11/28 职场文书
经典团队口号
2014/06/06 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL