欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django 認證類配置實現

 更新時間:2021年11月10日 15:35:35   作者:等到的等待  
本文主要介紹了django 認證類配置實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、配置認證類

1.認證全局配置文件

經過認證的源碼流程剖析,DRF的認證全局配置在api_setting中,以下是api_setings部分源碼:

api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS)

def reload_api_settings(*args, **kwargs):
    setting = kwargs['setting']
    if setting == 'REST_FRAMEWORK':  #項目中settings.py的key
        api_settings.reload()

setting_changed.connect(reload_api_settings)

其中引用了django,settings.py中的REST_FRAMEWORK作為key作為配置,所以全局配置示例:

#全局認證配置
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',]   #其中寫認證的類的路徑,不要在views中,這里我放在了utils目錄下auth.py中
}

2.局部使用

局部某個視圖不需要認證,則在視圖類中加入authentication_classes=[]

authentication_classes = []    #authentication_classes為空,代表不需要認證

3.匿名用戶配置:

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',],  #其中寫認證的類的路徑,不要在views中,這里我放在了utils目錄下auth.py中    "UNAUTHENTICATED_USER": lambda:"匿名",#匿名用戶配置,只需要函數或類的對應的返回值,對應request.user="匿名"
"UNAUTHENTICATED_token": None,#匿名token,只需要函數或類的對應的返回值,對應request.auth=None
}

二、內置認證類

1.BaseAuthentication

BaseAuthentication是django rest framework為我們提供了最基本的認證類,正如源碼流程一樣,該類中其中定義的兩個方法authenticate和authenticate_header(認證失敗返回的響應頭),使用時候重寫該兩個方法進行認證,正如示例:

class BaseAuthentication(object):
    """
    All authentication classes should extend BaseAuthentication.
    """def authenticate(self, request):
        """
        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)中,客戶端的發(fā)來的請求會執(zhí)行視圖類的as_view方法,而as_view方法中會執(zhí)行dispacth方法,然后在根據請求的類型(反射)執(zhí)行相應的方法(get、post等)。

2.使用django rest framework中的視圖類需要繼承APIView,請求到達視圖類會執(zhí)行視圖類的as_view方法,而OrderView中沒有as_view()方法,所以執(zhí)行APIView的as_view()方法,

3.從APIView源碼中可以看到APIView中as_view又執(zhí)行了父類的as_view方法,在看看APIView的父類是View類,這恰好是django中的view視圖類,

4.從View源碼可以看出View類的as_view()方法執(zhí)行流程:驗證請求方法--->返回view函數名稱(view函數會執(zhí)行dispatch方法),一旦有請求進來執(zhí)行view函數-->執(zhí)行dispatch方法

5.當APIView的as_view方法執(zhí)行了父類的as_view方法以后,請求進來會執(zhí)行view方法,view方法中會執(zhí)行dispatch方法,而Oderview沒有dispatch方法,所以執(zhí)行父類(APIView)的dispatch方法,

6.從APIView源碼分析,執(zhí)行APIView的dispatch方法時候會執(zhí)行self.initialize_request方法,會對django原始的request進行封裝。

7.self.initialize_request()源碼分析,實例化Request()類,封裝原始的request,authenticators(認證),執(zhí)行self.get_authenticators(),到了這里就開始django rest framework的認證流程

8.self.get_authenticators()源碼分析,采用列表生成式,循環(huán)self.authentication_classes,實例化其中的每一個類,返回列表,不難發(fā)現authentication_classes屬性正式我們在認證的時候用到認證類列表,這里會自動尋找該屬性進行認證。倘若我們的視圖類沒有定義認證方法呢?,當然django rest framework 已經給我們加了默認配置,如果我們沒有定義會自動使用settings中的DEFAULT_AUTHENTICATION_CLASSES作為默認(全局),

 9.繼續(xù)分析APIView的dispatch方法,此時執(zhí)行self.inital方法,并將封裝過后的request對象(Reuqest)作為參數進行傳遞,

10.在self.inital方法中會執(zhí)行self.perform_authentication方法,而self.perform_authentication方法用會執(zhí)行request.user,此時的request是Request對象,所以需分析Request類中的user屬性,

11.從源碼分析,在Request對象中,user屬性是一個屬性方法,并會執(zhí)行self._authentication方法,

12.從源碼分析,Request對象的self._authentication中循環(huán)self.authenticators(該列表是由認證對象構成的[對象1,對象2]),并執(zhí)行每一個對象中的authenticate方法返回tuple,同時對該過程其進行了異常捕捉,有異常將返回給用戶,下面是異常驗證邏輯:

如果有異常則執(zhí)行self._not_authenticated()方法,繼續(xù)向上拋異常。
如果有返回值必須是一個元組,分別賦值給self.user, self.auth(request.user和request.auth),并跳出循環(huán)。
如果返回None,則由下一個循環(huán)處理,如果都為None,則執(zhí)行self._not_authenticated(),返回 (AnonymousUser,None)
13.當都沒有返回值,就執(zhí)行self._not_authenticated(),相當于匿名用戶,沒有通過認證,并且此時django會返回默認的匿名用戶設置AnonymousUser,如需要單獨設置匿名用戶返回值,則編寫需要寫UNAUTHENTICATED_USER的返回值:

14.所以經過以上分析,我們需要進行認證時候,需要在每一個認證類中定義authenticate進行驗證,并且需要返回元祖。

到此這篇關于django 認證類配置實現的文章就介紹到這了,更多相關django 認證類配置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Django日志logging的配置和自定義添加方式

    Django日志logging的配置和自定義添加方式

    這篇文章主要介紹了Django日志logging的配置和自定義添加方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 一文帶你了解CNN(卷積神經網絡)

    一文帶你了解CNN(卷積神經網絡)

    CNN是神經網絡中的一種,它的權值共享網絡結構使之更類似于生物神經網絡,降低了網絡模型的復雜度,減少了權值的數量。本文主要講解了CNN(卷積神經網絡)的基礎內容,想了解更多的小伙伴可以看一看這篇文章
    2021-09-09
  • python 自定義異常和異常捕捉的方法

    python 自定義異常和異常捕捉的方法

    今天小編就為大家分享一篇python 自定義異常和異常捕捉的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python中rc1什么意思

    python中rc1什么意思

    在本篇文章里小編給大家整理了關于python中rc1的基礎知識點內容,需要的朋友們可以學習下。
    2020-06-06
  • Python實現堆排序案例詳解

    Python實現堆排序案例詳解

    這篇文章主要介紹了Python實現堆排序案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • python中的線程threading.Thread()使用詳解

    python中的線程threading.Thread()使用詳解

    這篇文章主要介紹了python中的線程threading.Thread()使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • pip安裝庫報錯[notice]?A?new?release?of?pip?available:?22.2?->?22.2.2

    pip安裝庫報錯[notice]?A?new?release?of?pip?available:?22.2

    這篇文章主要給大家介紹了關于pip安裝庫報錯[notice]?A?new?release?of?pip?available:?22.2?->?22.2.2的相關資料,文中通過圖文將解決的方法介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • 利用python實現蝴蝶曲線

    利用python實現蝴蝶曲線

    這篇文章主要介紹了如何利用python實現蝴蝶曲線,自然界的很多現象都可以適當的簡化用代數曲線和超越曲線來表達,下面我們就來利用去先畫出小蝴蝶,需要的小伙伴可以參考一下
    2022-03-03
  • Python列表生成式與生成器操作示例

    Python列表生成式與生成器操作示例

    這篇文章主要介紹了Python列表生成式與生成器操作,結合實例形式分析了Python列表生成式與生成器的功能、使用方法及相關操作技巧,需要的朋友可以參考下
    2018-08-08
  • Python編程之微信推送模板消息功能示例

    Python編程之微信推送模板消息功能示例

    這篇文章主要介紹了Python編程之微信推送模板消息功能,結合實例形式分析了Python微信推送消息接口的調用相關操作技巧,需要的朋友可以參考下
    2017-08-08

最新評論