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 xlrd读取excel日期类型的2种方法
Apr 28 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
django 解决manage.py migrate无效的问题
May 27 Python
python多个模块py文件的数据共享实例
Jan 11 Python
python3.6+selenium实现操作Frame中的页面元素
Jul 16 Python
感知器基础原理及python实现过程详解
Sep 30 Python
opencv3/python 鼠标响应操作详解
Dec 11 Python
Python小白不正确的使用类变量实例
May 29 Python
基于python tkinter的点名小程序功能的实例代码
Aug 22 Python
python中slice参数过长的处理方法及实例
Dec 15 Python
Python plt 利用subplot 实现在一张画布同时画多张图
Feb 26 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 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
《斗罗大陆》六翼天使武魂最强,为什么老千家不是上三宗?
2020/03/02 国漫
一个更简单的无限级分类菜单代码
2007/01/16 PHP
php Undefined index的问题
2009/06/01 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
PHP多例模式介绍
2013/06/24 PHP
php中动态调用函数的方法
2015/03/16 PHP
php生成PDF格式文件并且加密
2015/06/22 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
Angular(5.2->6.1)升级小结
2018/12/27 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
关于layui的动态图标不显示的解决方法
2019/09/04 Javascript
[01:10:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第一场 3月4日
2021/03/11 DOTA
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python中format()格式输出全解
2019/04/12 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Pandas中DataFrame的分组/分割/合并的实现
2019/07/16 Python
使用Django搭建一个基金模拟交易系统教程
2019/11/18 Python
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
美国精油公司:Plant Therapy
2019/05/17 全球购物
商务英语求职自荐信范文
2013/12/24 职场文书
毕业生求职信范文
2014/06/29 职场文书
化学教育专业求职信
2014/07/08 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
小学生思想品德评语
2014/12/31 职场文书
公司表扬信格式
2015/05/04 职场文书
员工安全责任协议书
2016/03/22 职场文书