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数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
Python pymongo模块用法示例
Mar 31 Python
python 显示数组全部元素的方法
Apr 19 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
python画微信表情符的实例代码
Oct 09 Python
python调用接口的4种方式代码实例
Nov 19 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
python-docx文件定位读取过程(尝试替换)
Feb 13 Python
详解python3 GUI刷屏器(附源码)
Feb 18 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使用array_fill定义多维数组的方法
2015/03/18 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
详解JS面向对象编程
2016/01/24 Javascript
EditPlus 正则表达式 实战(3)
2016/12/15 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
详解vue-cli项目开发/生产环境代理实现跨域请求
2019/07/23 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python开发编码规范
2006/09/08 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
Python Logging 日志记录入门学习
2018/06/02 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
Pandas删除数据的几种情况(小结)
2019/06/21 Python
python实现简易淘宝购物
2019/11/22 Python
Python 如何创建一个简单的REST接口
2020/07/30 Python
python如何构建mock接口服务
2021/01/28 Python
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
给老婆的保证书范文
2014/04/28 职场文书
领导班子个人查摆问题对照检查材料
2014/10/02 职场文书
单位作风建设自查报告
2014/10/23 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技