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 ip正则式
May 07 Python
python Django连接MySQL数据库做增删改查
Nov 07 Python
Python中的命令行参数解析工具之docopt详解
Mar 27 Python
python中kmeans聚类实现代码
Feb 23 Python
python中字符串的操作方法大全
Jun 03 Python
在Python中表示一个对象的方法
Jun 25 Python
python实现微信自动回复及批量添加好友功能
Jul 03 Python
python实现大文件分割与合并
Jul 22 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
python deque模块简单使用代码实例
Mar 12 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 DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
php GUID生成函数和类
2014/03/10 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
Vuex简单入门
2017/04/19 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
python调用windows api锁定计算机示例
2014/04/17 Python
用实例分析Python中method的参数传递过程
2015/04/02 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
python奇偶行分开存储实现代码
2018/03/19 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
django序列化serializers过程解析
2019/12/14 Python
python十进制转二进制的详解
2020/02/07 Python
Python项目跨域问题解决方案
2020/06/22 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
二手书店创业计划书
2014/01/16 职场文书
《在家里》教后反思
2014/03/01 职场文书
建筑结构施工求职信
2014/07/11 职场文书
泰山导游词
2015/02/02 职场文书
三国演义读书笔记
2015/06/25 职场文书
婚宴祝酒词大全
2015/08/10 职场文书
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏