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中readline判断文件读取结束的方法
Nov 08 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
Python 通过URL打开图片实例详解
Jun 01 Python
pandas把所有大于0的数设置为1的方法
Jan 26 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
Python Numpy 自然数填充数组的实现
Nov 28 Python
Pytorch实现神经网络的分类方式
Jan 08 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
浅谈Python 参数与变量
Jun 20 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 引用是个坏习惯
2010/03/12 PHP
php中对2个数组相加的函数
2011/06/24 PHP
php牛逼的面试题分享
2013/01/18 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
2016/10/19 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
tsconfig.json配置详解
2019/05/17 Javascript
vue3.0 搭建项目总结(详细步骤)
2019/05/20 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
Python中logging模块的用法实例
2014/09/29 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
2019/07/11 Python
Python连接字符串过程详解
2020/01/06 Python
Django之form组件自动校验数据实现
2020/01/14 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
python 如何调用远程接口
2020/09/11 Python
市场营销毕业生自荐信
2013/11/23 职场文书
医院护士专业个人的求职信
2013/12/09 职场文书
总经理司机岗位职责
2015/04/10 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
2019年教师节活动策划方案
2019/09/09 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
Python极值整数的边界探讨分析
2021/09/15 Python
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python