您好,登錄后才能下訂單哦!
這篇文章主要介紹“django認證類配置實現方法是什么”,在日常操作中,相信很多人在django認證類配置實現方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”django認證類配置實現方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
經過認證的源碼流程剖析,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中 }
局部某個視圖不需要認證,則在視圖類中加入authentication_classes=[]
authentication_classes = [] #authentication_classes為空,代表不需要認證
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 }
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
##路徑:rest_framework.authentication BasicAuthentication #基于瀏覽器進行認證 SessionAuthentication #基于django的session進行認證 RemoteUserAuthentication #基于django admin中的用戶進行認證,這也是官網的示例 TokenAuthentication #基于drf內部的token認證
繼承BaseAuthentication,重寫authenticate方法和authenticate_header(pass就可以),authenticate()方法需要有三種情況(返回元祖、出現異常、返回none)。
#全局認證 REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',] } #局部認證 authentication_classes = [BaseAuthentication,] #是某個視圖不進行認證 authentication_classes =[]
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認證類配置實現方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。