最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django?Rest?Framework實(shí)現(xiàn)身份認(rèn)證源碼詳解

 更新時(shí)間:2022年05月19日 10:01:27   作者:lemon?*  
這篇文章主要為大家介紹了Django?Rest?Framework實(shí)現(xiàn)身份認(rèn)證源碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一.Django框架

Django確實(shí)是一個(gè)很強(qiáng)大,用起來(lái)很爽的一個(gè)框架,在Rest Framework中已經(jīng)將身份認(rèn)證全都封裝好了,用的時(shí)候直接導(dǎo)入authentication.py這個(gè)模塊就好了。這個(gè)模塊中5個(gè)認(rèn)證類。但是我們?cè)陂_發(fā)中很少用自帶的認(rèn)證類,而是根據(jù)項(xiàng)目實(shí)際需要去自己實(shí)現(xiàn)認(rèn)證類。下面是內(nèi)置的認(rèn)證類

BaseAuthentication(object):所有的認(rèn)證相關(guān)的類都繼承自這個(gè)類,我們寫的認(rèn)證類也要繼承自這個(gè)認(rèn)證類,類中面有兩個(gè)方法,authenticate(self,request):這個(gè)方法是我們開發(fā)中用的最多的,還有一個(gè)方法:authentication_header(self,request):這個(gè)方法主要是給瀏覽器返回響應(yīng)頭的。

BasicAuthentication(BaseAuthentication):這個(gè)是基于瀏覽器實(shí)現(xiàn)的認(rèn)證類。

SessionAuthentication(BaseAuthentication):使用Django的會(huì)話框架進(jìn)行身份驗(yàn)證。

TokenAuthentication(BaseAuthentication):簡(jiǎn)單的基于令牌的身份驗(yàn)證??蛻舳藨?yīng)通過(guò)在“授權(quán)”中傳遞令牌密鑰進(jìn)行身份驗(yàn)證HTTP頭,前面加上字符串“Token”

RemoteUserAuthentication(BaseAuthentication):遠(yuǎn)程用戶身份驗(yàn)證。

二.身份認(rèn)證的兩種實(shí)現(xiàn)方式:

1.第一種方式就是在views.py模塊中去創(chuàng)建一個(gè)認(rèn)證類,這個(gè)認(rèn)證類必須重寫authenticate()這個(gè)方法,這個(gè)方法必須返回一個(gè)元組,里面返回用戶和token值,然后在需要認(rèn)證的類視圖中注冊(cè)上這個(gè)認(rèn)證類:

authentication_classes = [AuthClass,],authentication_classes

名字也不能改,后面講源碼的時(shí)候會(huì)告訴大家為什么這么寫。這是第一種認(rèn)證方式。

2.①:第二中方式是在settings中配置認(rèn)證模塊,這種方式是全局身份認(rèn)證。首先創(chuàng)建一個(gè)utils工具包,然后創(chuàng)建一個(gè)auth.py身份認(rèn)證模塊。把認(rèn)證類寫在這里面。這是開發(fā)中經(jīng)常使用的方式,這樣views.py中全是類視圖,把認(rèn)證類放到認(rèn)證模塊中,符合高內(nèi)聚,低耦合的編程思想,也方便后期管理維護(hù)。

②:然后將這個(gè)認(rèn)證模塊注冊(cè)到settings.py中,這是全局認(rèn)證,所有的類視圖都會(huì)進(jìn)行身份認(rèn)證。

③:用戶登錄的借口是不需要身份認(rèn)證的,所以在用戶登錄接口中加上authentication_classes = [],這樣登錄接口就不會(huì)進(jìn)行身份認(rèn)證了。

三.身份認(rèn)證源碼解析流程

1.首先當(dāng)一個(gè)請(qǐng)求過(guò)來(lái)的時(shí)候,先走路由的as_view()方法,as_view()方法中調(diào)用了dispatch方法,rest framework 中的APIView(view)繼承自django中的view,然后重寫了dispatch()方法,于是走APIView中的dispatch()方法。

2.重寫的dispatch()對(duì)django的request進(jìn)行了重新的封裝,調(diào)用了initizlize_request()方法對(duì)request進(jìn)行封裝,我們進(jìn)入initizlize_request()這個(gè)方法再看一下做了什么操作。

3.initializer_request()這個(gè)方法中調(diào)用了get_authenticators()得到認(rèn)證對(duì)象的這個(gè)方法,我們?cè)龠M(jìn)入這個(gè)方法看一下做了什么。

4.進(jìn)入get_authenticators()中發(fā)現(xiàn),這個(gè)方法中有一個(gè)列表生成器,用來(lái)實(shí)例化當(dāng)前認(rèn)證類,這就是為什么之前要在類視圖中注冊(cè)認(rèn)證類必須要用這個(gè)名字的原因,因?yàn)樵创a中規(guī)定了認(rèn)證類讀取的名字。

所以,如果我們自己寫了認(rèn)證類,他會(huì)在類視圖中找到我們的認(rèn)證類并執(zhí)行返回,如果我們沒(méi)有寫認(rèn)證類呢?會(huì)怎么執(zhí)行?我們繼續(xù)往下看,看看列表生成器中調(diào)中的authentication_classes這個(gè)屬性它是從哪獲得的。

5.我們發(fā)現(xiàn)authentication_classes默認(rèn)是從settings中配置獲得的。所以這也是為啥可以把認(rèn)證類配置在settings中的原因。

然后這就是initizlize_request()方法對(duì)request的認(rèn)證封裝的執(zhí)行流程,封裝完后在dispatch()中繼續(xù)往下執(zhí)行,當(dāng)前只是實(shí)例化認(rèn)證類,并沒(méi)有執(zhí)行認(rèn)證。然后我們接著看dispatch()下面認(rèn)證的執(zhí)行流程

6.dispatch()調(diào)用initial(request, *args, **kwargs)這個(gè)方法進(jìn)行認(rèn)證,我們看下initial(request, *args, **kwargs)這個(gè)方法做了什么。

7.initial(request, *args, **kwargs)這個(gè)方法中又調(diào)用了三個(gè)方法:

perform_authentication(request):身份認(rèn)證方法

check_permissions(request):權(quán)限驗(yàn)證方法

check_throttles(request):節(jié)流方法

我們看下perform_authentication(request):身份認(rèn)證方法都干了些什么。

8.perform_authentication(request):身份認(rèn)證方法只調(diào)用了一個(gè)user方法,我們繼續(xù)看user這個(gè)方法。

9.user這個(gè)方法調(diào)用了_authenticate()這個(gè)方法,繼續(xù)往下看。

10.這次只終于到底了,_authenticate()方法中遍歷認(rèn)證類的所有對(duì)象,執(zhí)行認(rèn)證類的authenticate方法,這個(gè)就是我們寫的身份認(rèn)證方法,這個(gè)方法要返回一個(gè)元組,我們看下authenticate方法。

11.authenticate()方法返回一個(gè)元組,元組中包含當(dāng)前對(duì)象和token值,所以我們重寫authenticate()方法也要返回這個(gè)元組。這樣整個(gè)認(rèn)證執(zhí)行流程就全結(jié)束了。

如果authenitcate()方法拋出異常,就被捕獲并執(zhí)行 self._not_authenticated(),認(rèn)證不通過(guò)并直接返回,就不會(huì)走dispatch()下面反射機(jī)制找視圖函數(shù)方法了,反射機(jī)制上篇博客我詳細(xì)的說(shuō)過(guò)了,這里就不說(shuō)了,如果沒(méi)有拋出異常,繼續(xù)走dispatch()下面的代碼。

以上就是Django Rest Framework實(shí)現(xiàn)身份認(rèn)證源碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Django Rest Framework身份認(rèn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python中的flask框架Jinja?模板入門教程

    python中的flask框架Jinja?模板入門教程

    這篇文章主要介紹了?python中的flask框架Jinja?模板入門,Jinja?模板其實(shí)是?html?文件,一般情況下放在?Flask?工程的?/templates?目錄下,對(duì)python?flask?Jinja?模板相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-04-04
  • Python光學(xué)仿真實(shí)現(xiàn)波長(zhǎng)與顏色之間對(duì)應(yīng)關(guān)系示例解析

    Python光學(xué)仿真實(shí)現(xiàn)波長(zhǎng)與顏色之間對(duì)應(yīng)關(guān)系示例解析

    這篇文章主要為大家介紹了Python光學(xué)仿真實(shí)現(xiàn)波長(zhǎng)與顏色之間對(duì)應(yīng)關(guān)系的示例解析,有需要的我朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Python 爬取必應(yīng)壁紙的實(shí)例講解

    Python 爬取必應(yīng)壁紙的實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于Python 爬取必應(yīng)壁紙的實(shí)例講解,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2020-02-02
  • Python基于pip實(shí)現(xiàn)離線打包過(guò)程詳解

    Python基于pip實(shí)現(xiàn)離線打包過(guò)程詳解

    這篇文章主要介紹了Python基于pip實(shí)現(xiàn)離線打包過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python中tkinter開發(fā)的常用29種功能用法總結(jié)

    Python中tkinter開發(fā)的常用29種功能用法總結(jié)

    tkinter(Tk?interface)是Python的標(biāo)準(zhǔn)GUl庫(kù),支持跨平臺(tái)的GUl程序開發(fā),本文為大家整理了tkinter開發(fā)時(shí)常用的29種功能用法,希望對(duì)大家有所幫助
    2023-05-05
  • 淺析python多線程中的鎖

    淺析python多線程中的鎖

    這篇文章主要介紹了淺析python多線程中的鎖,鎖由Python的threading模塊提供,并且它最多被一個(gè)線程所持有,當(dāng)一個(gè)線程試圖獲取一個(gè)已經(jīng)鎖在資源上的鎖時(shí),該線程通常會(huì)暫停運(yùn)行,直到這個(gè)鎖被釋放,需要的朋友可以參考下
    2023-07-07
  • 在django中使用apscheduler 執(zhí)行計(jì)劃任務(wù)的實(shí)現(xiàn)方法

    在django中使用apscheduler 執(zhí)行計(jì)劃任務(wù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了如何在django中使用apscheduler 執(zhí)行計(jì)劃任務(wù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 基于Python-Pycharm實(shí)現(xiàn)的猴子摘桃小游戲(源代碼)

    基于Python-Pycharm實(shí)現(xiàn)的猴子摘桃小游戲(源代碼)

    這篇文章主要介紹了基于Python-Pycharm實(shí)現(xiàn)的猴子摘桃小游戲,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Python中用altzone()方法處理時(shí)區(qū)的教程

    Python中用altzone()方法處理時(shí)區(qū)的教程

    這篇文章主要介紹了Python中用altzone()方法處理時(shí)區(qū)的教程,是Python入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • 基于Python實(shí)現(xiàn)人像雪景小程序

    基于Python實(shí)現(xiàn)人像雪景小程序

    這篇文章主要介紹了通過(guò)Python實(shí)現(xiàn)的人像雪景小程序,小程序還會(huì)自動(dòng)生成每一幀雪花飄落的圖片,跟GIF動(dòng)態(tài)雪花人像圖,還不用自己錄制視頻看效果。感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12

最新評(píng)論

房产| 绥芬河市| 庐江县| 景洪市| 贺兰县| 资阳市| 漠河县| 曲水县| 东辽县| 通江县| 黄大仙区| 犍为县| 上高县| 札达县| 宁乡县| 北京市| 浦城县| 盐源县| 东辽县| 瑞昌市| 吉首市| 大方县| 永宁县| 同心县| 图片| 泗阳县| 三台县| 吴旗县| 和林格尔县| 沁水县| 柘荣县| 颍上县| 奉贤区| 白山市| 晋州市| 古交市| 库尔勒市| 犍为县| 天峨县| 凤山县| 宁乡县|