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正则表达式判断字符串是否是全部小写示例
Dec 25 Python
Python操作列表的常用方法分享
Feb 13 Python
python使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
python类的继承实例详解
Mar 30 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
jupyter notebook插入本地图片的实现
Apr 13 Python
Python中实现输入一个整数的案例
May 03 Python
python map比for循环快在哪
Sep 21 Python
Ubuntu20下的Django安装的方法步骤
Jan 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
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
PHP文件操作方法汇总
2015/07/01 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
javascript for循环设法提高性能
2010/02/24 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
2012/03/16 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
python获取一组汉字拼音首字母的方法
2015/07/01 Python
详解Python Socket网络编程
2016/01/05 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
超简单的Python HTTP服务
2019/07/22 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
巴西葡萄酒商店:Divvino
2020/02/22 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
高中生学习的自我评价
2013/12/14 职场文书
催款函范本大全
2015/06/24 职场文书
pandas求平均数和中位数的方法实例
2021/08/04 Python
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB