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程序中实现分布式进程的教程
Apr 28 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
python进阶之自定义可迭代的类
Aug 20 Python
Python FtpLib模块应用操作详解
Dec 12 Python
python3下pygame如何实现显示中文
Jan 11 Python
Python openpyxl 插入折线图实例
Apr 17 Python
python归并排序算法过程实例讲解
Nov 04 Python
python全栈开发语法总结
Nov 22 Python
python 爬取天气网卫星图片
Jun 07 Python
利用Python实现Picgo图床工具
Nov 23 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正则表达式使用的详细介绍
2013/04/27 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
PHP实现简单的计算器
2020/08/28 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
详解小程序云开发数据库
2019/05/20 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
pyqt和pyside开发图形化界面
2014/01/22 Python
Python 专题一 函数的基础知识
2017/03/16 Python
Python错误: SyntaxError: Non-ASCII character解决办法
2017/06/08 Python
Python对wav文件的重采样实例
2020/02/25 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
python实现用户名密码校验
2020/03/18 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
Python爬虫实现自动登录、签到功能的代码
2020/08/20 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
HTML5视频支持检测(检查浏览器是否支持视频播放)
2013/06/08 HTML / CSS
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
打印机墨盒:123Inkjets
2017/02/16 全球购物
暖通工程师岗位职责
2014/06/12 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
golang elasticsearch Client的使用详解
2021/05/05 Golang
react合成事件与原生事件的相关理解
2021/05/13 Javascript
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers