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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
在双python下设置python3为默认的方法
Oct 31 Python
python dict 相同key 合并value的实例
Jan 21 Python
详解Python匿名函数(lambda函数)
Apr 19 Python
Django ORM 常用字段与不常用字段汇总
Aug 09 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
Python中递归以及递归遍历目录详解
Oct 24 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 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
js中判断控件是否存在
2010/08/25 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
如何开发出更好的JavaScript模块
2017/12/22 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
原生JavaScript实现刮刮乐
2020/09/29 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
python实现随机漫步算法
2018/08/27 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
MYSQL支持事务吗
2013/08/09 面试题
高中毕业生自我鉴定
2013/11/03 职场文书
兼职学生的自我评价
2013/11/24 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL
java中如何截取字符串最后一位
2022/07/07 Java/Android