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之做一个小游戏
Sep 28 Python
Python转换HTML到Text纯文本的方法
Jan 15 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
Python将图片转换为字符画的方法
Jun 16 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
python远程连接MySQL数据库
Apr 19 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
Python Lambda函数使用总结详解
Dec 11 Python
python绘制封闭多边形教程
Feb 18 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 23 Python
Python matplotlib安装以及实现简单曲线的绘制
Apr 26 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
我的论坛源代码(五)
2006/10/09 PHP
php class类的用法详细总结
2013/10/17 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
php实现的mongodb操作类
2015/05/28 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
2016/11/10 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
Python中断言Assertion的一些改进方案
2016/10/27 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
对Xpath 获取子标签下所有文本的方法详解
2019/01/02 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
详解Python字符串切片
2019/05/20 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
python3 配置logging日志类的操作
2020/04/08 Python
Python中的__init__作用是什么
2020/06/09 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
结婚邀请函范文
2014/01/14 职场文书
社会发展项目建议书
2014/08/25 职场文书
2015年三万活动总结
2015/03/25 职场文书
小学生读书笔记范文
2015/06/30 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
Python实现排序方法常见的四种
2021/07/15 Python