Django使用中间键实现csrf认证详解

 更新时间:2019年07月22日 09:41:02   作者:Crazymagic  
这篇文章主要介绍了Django使用中间键实现csrf认证详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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如何统计字符串中字符的个数

    这篇文章主要给大家介绍了关于python如何统计字符串中字符的个数的相关资料,如果在一个字符串中,需要统计某个字符或字符串出现的次数,可以使用count方法,需要的朋友可以参考下
    2023-10-10
  • python实现flappy bird游戏

    python实现flappy bird游戏

    这篇文章主要为大家详细介绍了python实现flappy bird游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • python目标检测YoloV4当中的Mosaic数据增强方法

    python目标检测YoloV4当中的Mosaic数据增强方法

    这篇文章主要为大家介绍了python目标检测YoloV4当中的Mosaic数据增强方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python实现一个简单的验证码程序

    Python实现一个简单的验证码程序

    这篇文章主要介绍了Python实现一个简单的验证码程序,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 由面试题加深对Django的认识理解

    由面试题加深对Django的认识理解

    这篇文章主要介绍了由面试题加深对Django的认识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Tensorflow实现多GPU并行方式

    Tensorflow实现多GPU并行方式

    今天小编就为大家分享一篇Tensorflow实现多GPU并行方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Django动态展示Pyecharts图表数据的几种方法

    Django动态展示Pyecharts图表数据的几种方法

    本文主要介绍了Django动态展示Pyecharts图表数据的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • matplotlib绘图实例演示标记路径

    matplotlib绘图实例演示标记路径

    这篇文章主要介绍了matplotlib绘图实例演示标记路径,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • python实现下载指定网址所有图片的方法

    python实现下载指定网址所有图片的方法

    这篇文章主要介绍了python实现下载指定网址所有图片的方法,涉及Python针对页面的读取、遍历及文件操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • Python实现提取语句中的人名

    Python实现提取语句中的人名

    这篇文章主要为大家介绍一个小工具:可以将语句中的人名提取出来。文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-01-01

最新评论