django认证类配置实现方法是什么

技术django认证类配置实现方法是什么这篇文章主要介绍“django认证类配置实现方法是什么”,在日常操作中,相信很多人在django认证类配置实现方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法

本文主要介绍“django认证配置的实现方法是什么”。在日常操作中,相信很多人对django认证配置的实现方法有所怀疑。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮助大家解答“django认证配置的实现方法是什么”的疑惑!接下来,请和边肖一起学习!

00-101010

一、配置认证类

认证源代码流分析,DRF认证全局配置在api_setting,以下是API _ settings部分源代码:

api_settings=APISettings(None,DEFAULTS,IMPORT_STRINGS)

defreload_api_settings(*args,**kwargs):

setting=kwargs['setting']

If setting==key of settings.py在' rest _ framework' : #项目中的键

api_settings.reload()

setting _ changed . connect(reload _ API _ settings)引用django,REST_FRAMEWORK在settings.py中作为键作为配置,所以全局配置示例:

#全局身份验证配置

REST _ FRAMEWORK=

default _ authentication _ class ' :[' API . utils . auth . authentication ',] #编写身份验证的类的路径不在视图中,但在这里我将其放在utils目录下的auth.py中。

}

1.认证全局配置文件

如果本地视图不需要身份验证,请将authentication _ class=[]添加到视图类中。

authentication _ class=[]# authentication _ class为空,这意味着不需要身份验证

2.局部使用

REST _ FRAMEWORK={ 0

default _ authentication _ class ' : [' API . utils . auth . authentication ',],#已验证类的路径写在哪里,不要在视图中,这里,我把auth.py中的' unauthenticated _ user ' : lambda 3360 ' anonymous '放在utils目录下,# anonymous用户配置,只有函数或类对应的返回值,对应request.user=' anonymous '

unauthenticated _ token ' : None,#匿名令牌,只有对应于request.auth=None的函数或类的相应返回值。

}

3.匿名用户配置:

二、内置认证类

base authentication是django rest框架提供的最基本的身份验证类。就像源代码流一样,这个类中定义的两个方法authenticate和authenticate_header(身份验证失败后返回的响应头)在使用时会被重写以进行身份验证,就像一个示例:

基于类的身份验证(对象):

'''

allauthenticationclasseshouldextendbaseauthentication。

''默认身份验证(自我,请求):

'''

不间断空格

;Authenticate the request and return a two-tuple of (user, token).
        """raise NotImplementedError(".authenticate() must be overridden.")
    def authenticate_header(self, request):
        """
        Return a string to be used as the value of the `WWW-Authenticate`
        header in a `401 Unauthenticated` response, or `None` if the
        authentication scheme should return `403 Permission Denied` responses.
        """pass

2.其他认证类

##路径:rest_framework.authentication
BasicAuthentication  #基于浏览器进行认证
SessionAuthentication #基于django的session进行认证
RemoteUserAuthentication #基于django admin中的用户进行认证,这也是官网的示例
TokenAuthentication #基于drf内部的token认证

三、总结

1.自定义认证类:

继承BaseAuthentication,重写authenticate方法和authenticate_header(pass就可以),authenticate()方法需要有三种情况(返回元祖、出现异常、返回none)。

2.认证配置:

#全局认证
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',]
}
#局部认证
authentication_classes = [BaseAuthentication,]
#是某个视图不进行认证
authentication_classes =[]

3.源码流程:

1.在django(CBV)中,客户端的发来的请求会执行视图类的as_view方法,而as_view方法中会执行dispacth方法,然后在根据请求的类型(反射)执行相应的方法(get、post等)。

2.使用django rest framework中的视图类需要继承APIView,请求到达视图类会执行视图类的as_view方法,而OrderView中没有as_view()方法,所以执行APIView的as_view()方法,

3.从APIView源码中可以看到APIView中as_view又执行了父类的as_view方法,在看看APIView的父类是View类,这恰好是django中的view视图类,

4.从View源码可以看出View类的as_view()方法执行流程:验证请求方法--->返回view函数名称(view函数会执行dispatch方法),一旦有请求进来执行view函数-->执行dispatch方法

5.当APIView的as_view方法执行了父类的as_view方法以后,请求进来会执行view方法,view方法中会执行dispatch方法,而Oderview没有dispatch方法,所以执行父类(APIView)的dispatch方法,

6.从APIView源码分析,执行APIView的dispatch方法时候会执行self.initialize_request方法,会对django原始的request进行封装。

7.self.initialize_request()源码分析,实例化Request()类,封装原始的request,authenticators(认证),执行self.get_authenticators(),到了这里就开始django rest framework的认证流程

8.self.get_authenticators()源码分析,采用列表生成式,循环self.authentication_classes,实例化其中的每一个类,返回列表,不难发现authentication_classes属性正式我们在认证的时候用到认证类列表,这里会自动寻找该属性进行认证。倘若我们的视图类没有定义认证方法呢?,当然django rest framework 已经给我们加了默认配置,如果我们没有定义会自动使用settings中的DEFAULT_AUTHENTICATION_CLASSES作为默认(全局),

 9.继续分析APIView的dispatch方法,此时执行self.inital方法,并将封装过后的request对象(Reuqest)作为参数进行传递,

10.在self.inital方法中会执行self.perform_authentication方法,而self.perform_authentication方法用会执行request.user,此时的request是Request对象,所以需分析Request类中的user属性,

11.从源码分析,在Request对象中,user属性是一个属性方法,并会执行self._authentication方法,

12.从源码分析,Request对象的self._authentication中循环self.authenticators(该列表是由认证对象构成的[对象1,对象2]),并执行每一个对象中的authenticate方法返回tuple,同时对该过程其进行了异常捕捉,有异常将返回给用户,下面是异常验证逻辑:

如果有异常则执行self._not_authenticated()方法,继续向上抛异常。
如果有返回值必须是一个元组,分别赋值给self.user, self.auth(request.user和request.auth),并跳出循环。
如果返回None,则由下一个循环处理,如果都为None,则执行self._not_authenticated(),返回 (AnonymousUser,None)
13.当都没有返回值,就执行self._not_authenticated(),相当于匿名用户,没有通过认证,并且此时django会返回默认的匿名用户设置AnonymousUser,如需要单独设置匿名用户返回值,则编写需要写UNAUTHENTICATED_USER的返回值:

14.所以经过以上分析,我们需要进行认证时候,需要在每一个认证类中定义authenticate进行验证,并且需要返回元祖。

到此,关于“django认证类配置实现方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/80627.html

(0)

相关推荐

  • html中如何设置边框上下居中(html怎么让td显示的文字靠左)

    技术HTML如何设置td内容居中这篇文章主要讲解了“HTML如何设置td内容居中”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HTML如何设置td内容居中”吧!

    攻略 2021年12月23日
  • 腾讯新闻基于 Flink PipeLine 模式的实践

    技术腾讯新闻基于 Flink PipeLine 模式的实践 腾讯新闻基于 Flink PipeLine 模式的实践基于腾讯云流计算Oceanus和PipeLine搭建的实时数据仓库思想摘要 :随着社会消

    礼包 2021年12月16日
  • ThinkPHP3.2如何实现中英文切换

    技术ThinkPHP3.2如何实现中英文切换这篇文章主要介绍了ThinkPHP3.2如何实现中英文切换,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.

    攻略 2021年11月19日
  • 去角质产品排行榜10强,能否推荐一下脸部去角质的产品

    技术去角质产品排行榜10强,能否推荐一下脸部去角质的产品我用的是美肤宝精粹角质嗜喱去角质产品排行榜10强。这是一款智能去角质产品!也许有人会问,智能去角质产品,是不是就比普通的去角质产品去除的更多?结果恰恰相反!智能去角

    生活 2021年10月23日
  • 如何用Python爬取小红书

    技术如何用Python爬取小红书如何用Python爬取小红书,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。小红书首先,我们打开之前大家配置好的charles

    攻略 2021年10月26日
  • 吃什么东西可以补肾,什么食物补肾 ????????

    技术吃什么东西可以补肾,什么食物补肾 ????????介绍肾虚食谱秘方数则如下,希望对您能有所帮助吃什么东西可以补肾。海参粥:水发海参(切碎)50克,粳米100克,同煮成粥,加少许葱姜食盐调味。枸杞猪腰粥:枸杞子10克,

    生活 2021年10月29日