django 認(rèn)證類配置實(shí)現(xiàn)
一、配置認(rèn)證類
1.認(rèn)證全局配置文件
經(jīng)過認(rèn)證的源碼流程剖析,DRF的認(rèn)證全局配置在api_setting中,以下是api_setings部分源碼:
api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS)
def reload_api_settings(*args, **kwargs):
setting = kwargs['setting']
if setting == 'REST_FRAMEWORK': #項(xiàng)目中settings.py的key
api_settings.reload()
setting_changed.connect(reload_api_settings)
其中引用了django,settings.py中的REST_FRAMEWORK作為key作為配置,所以全局配置示例:
#全局認(rèn)證配置
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',] #其中寫認(rèn)證的類的路徑,不要在views中,這里我放在了utils目錄下auth.py中
}
2.局部使用
局部某個(gè)視圖不需要認(rèn)證,則在視圖類中加入authentication_classes=[]
authentication_classes = [] #authentication_classes為空,代表不需要認(rèn)證
3.匿名用戶配置:
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',], #其中寫認(rèn)證的類的路徑,不要在views中,這里我放在了utils目錄下auth.py中 "UNAUTHENTICATED_USER": lambda:"匿名",#匿名用戶配置,只需要函數(shù)或類的對應(yīng)的返回值,對應(yīng)request.user="匿名"
"UNAUTHENTICATED_token": None,#匿名token,只需要函數(shù)或類的對應(yīng)的返回值,對應(yīng)request.auth=None
}
二、內(nèi)置認(rèn)證類
1.BaseAuthentication
BaseAuthentication是django rest framework為我們提供了最基本的認(rèn)證類,正如源碼流程一樣,該類中其中定義的兩個(gè)方法authenticate和authenticate_header(認(rèn)證失敗返回的響應(yīng)頭),使用時(shí)候重寫該兩個(gè)方法進(jìn)行認(rèn)證,正如示例:
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.其他認(rèn)證類
##路徑:rest_framework.authentication BasicAuthentication #基于瀏覽器進(jìn)行認(rèn)證 SessionAuthentication #基于django的session進(jìn)行認(rèn)證 RemoteUserAuthentication #基于django admin中的用戶進(jìn)行認(rèn)證,這也是官網(wǎng)的示例 TokenAuthentication #基于drf內(nèi)部的token認(rèn)證
三、總結(jié)
1.自定義認(rèn)證類:
繼承BaseAuthentication,重寫authenticate方法和authenticate_header(pass就可以),authenticate()方法需要有三種情況(返回元祖、出現(xiàn)異常、返回none)。
2.認(rèn)證配置:
#全局認(rèn)證
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',]
}
#局部認(rèn)證
authentication_classes = [BaseAuthentication,]
#是某個(gè)視圖不進(jìn)行認(rèn)證
authentication_classes =[]
3.源碼流程:
1.在django(CBV)中,客戶端的發(fā)來的請求會執(zhí)行視圖類的as_view方法,而as_view方法中會執(zhí)行dispacth方法,然后在根據(jù)請求的類型(反射)執(zhí)行相應(yīng)的方法(get、post等)。
2.使用django rest framework中的視圖類需要繼承APIView,請求到達(dá)視圖類會執(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í)行流程:驗(yàn)證請求方法--->返回view函數(shù)名稱(view函數(shù)會執(zhí)行dispatch方法),一旦有請求進(jìn)來執(zhí)行view函數(shù)-->執(zhí)行dispatch方法
5.當(dāng)APIView的as_view方法執(zhí)行了父類的as_view方法以后,請求進(jìn)來會執(zhí)行view方法,view方法中會執(zhí)行dispatch方法,而Oderview沒有dispatch方法,所以執(zhí)行父類(APIView)的dispatch方法,
6.從APIView源碼分析,執(zhí)行APIView的dispatch方法時(shí)候會執(zhí)行self.initialize_request方法,會對django原始的request進(jìn)行封裝。
7.self.initialize_request()源碼分析,實(shí)例化Request()類,封裝原始的request,authenticators(認(rèn)證),執(zhí)行self.get_authenticators(),到了這里就開始django rest framework的認(rèn)證流程
8.self.get_authenticators()源碼分析,采用列表生成式,循環(huán)self.authentication_classes,實(shí)例化其中的每一個(gè)類,返回列表,不難發(fā)現(xiàn)authentication_classes屬性正式我們在認(rèn)證的時(shí)候用到認(rèn)證類列表,這里會自動尋找該屬性進(jìn)行認(rèn)證。倘若我們的視圖類沒有定義認(rèn)證方法呢?,當(dāng)然django rest framework 已經(jīng)給我們加了默認(rèn)配置,如果我們沒有定義會自動使用settings中的DEFAULT_AUTHENTICATION_CLASSES作為默認(rèn)(全局),
9.繼續(xù)分析APIView的dispatch方法,此時(shí)執(zhí)行self.inital方法,并將封裝過后的request對象(Reuqest)作為參數(shù)進(jìn)行傳遞,
10.在self.inital方法中會執(zhí)行self.perform_authentication方法,而self.perform_authentication方法用會執(zhí)行request.user,此時(shí)的request是Request對象,所以需分析Request類中的user屬性,
11.從源碼分析,在Request對象中,user屬性是一個(gè)屬性方法,并會執(zhí)行self._authentication方法,
12.從源碼分析,Request對象的self._authentication中循環(huán)self.authenticators(該列表是由認(rèn)證對象構(gòu)成的[對象1,對象2]),并執(zhí)行每一個(gè)對象中的authenticate方法返回tuple,同時(shí)對該過程其進(jìn)行了異常捕捉,有異常將返回給用戶,下面是異常驗(yàn)證邏輯:
如果有異常則執(zhí)行self._not_authenticated()方法,繼續(xù)向上拋異常。
如果有返回值必須是一個(gè)元組,分別賦值給self.user, self.auth(request.user和request.auth),并跳出循環(huán)。
如果返回None,則由下一個(gè)循環(huán)處理,如果都為None,則執(zhí)行self._not_authenticated(),返回 (AnonymousUser,None)
13.當(dāng)都沒有返回值,就執(zhí)行self._not_authenticated(),相當(dāng)于匿名用戶,沒有通過認(rèn)證,并且此時(shí)django會返回默認(rèn)的匿名用戶設(shè)置AnonymousUser,如需要單獨(dú)設(shè)置匿名用戶返回值,則編寫需要寫UNAUTHENTICATED_USER的返回值:
14.所以經(jīng)過以上分析,我們需要進(jìn)行認(rèn)證時(shí)候,需要在每一個(gè)認(rèn)證類中定義authenticate進(jìn)行驗(yàn)證,并且需要返回元祖。
到此這篇關(guān)于django 認(rèn)證類配置實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)django 認(rèn)證類配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python實(shí)現(xiàn)baidu hi自動登錄的代碼
使用python自動登錄baidu hi的代碼,有需要的朋友可以參考下2013-02-02
Python 實(shí)現(xiàn)判斷圖片格式并轉(zhuǎn)換,將轉(zhuǎn)換的圖像存到生成的文件夾中
今天小編就為大家分享一篇Python判斷圖片格式并轉(zhuǎn)換,將轉(zhuǎn)換的圖像存到生成的文件夾中,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python史上最全種類數(shù)據(jù)庫操作方法分享
本文將詳細(xì)探討如何在Python中連接全種類數(shù)據(jù)庫以及實(shí)現(xiàn)相應(yīng)的CRUD(創(chuàng)建,讀取,更新,刪除)操作,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-07-07
Python實(shí)現(xiàn)統(tǒng)計(jì)文本文件字?jǐn)?shù)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)統(tǒng)計(jì)文本文件字?jǐn)?shù)的方法,涉及Python針對文本文件讀取及字符串轉(zhuǎn)換、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-05-05
python光學(xué)仿真學(xué)習(xí)wxpython創(chuàng)建手速測試程序
這篇文章主要介紹了python光學(xué)仿真學(xué)習(xí)使用wxpython創(chuàng)建一個(gè)手速測試程序示例的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
詳解PyTorch預(yù)定義數(shù)據(jù)集類datasets.ImageFolder使用方法
這篇文章主要為大家介紹了PyTorch預(yù)定義數(shù)據(jù)集類datasets.ImageFolder使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Python?Nuitka打包的實(shí)現(xiàn)步驟
在Python應(yīng)用程序開發(fā)中,打包是將代碼和依賴項(xiàng)組合成可執(zhí)行文件或庫的關(guān)鍵步驟之一,本文主要介紹了Python?Nuitka打包的實(shí)現(xiàn)步驟,感興趣的可以了解一下2023-12-12
Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié)
使用urllib2模塊進(jìn)行基于url的HTTP請求等操作大家也許都比較熟悉,這里我們再深入來了解一下urllib2針對HTTP的異常處理相關(guān)功能,一起來看一下Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié):2016-07-07
Django框架ORM操作數(shù)據(jù)庫不生效問題示例解決方法
本文詳細(xì)描述使用Django 的ORM框架操作PostgreSQL數(shù)據(jù)庫刪除不生效問題的定位過程及解決方案,并總結(jié)使用ORM框架操作數(shù)據(jù)庫不生效的問題的通用定位方法,感興趣的朋友跟隨小編一起看看吧2023-01-01

