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实现
Jan 28 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
Jan 15 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
Python之用户输入的实例
Jun 22 Python
Python常见数据结构之栈与队列用法示例
Jan 14 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
使用django和vue进行数据交互的方法步骤
Nov 11 Python
Python类如何定义私有变量
Feb 03 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
python缺失值的解决方法总结
Jun 09 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
PHP5中MVC结构学习
2006/10/09 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
8个PHP数组面试题
2015/06/23 PHP
thinkphp利用模型通用数据编辑添加和删除的实例代码
2016/11/20 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
js数字计算 误差问题的快速解决方法
2017/02/28 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
python中bisect模块用法实例
2014/09/25 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
初婚未育未抱养证明
2014/01/12 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
项目建议书格式
2014/03/12 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书