摘要:認證源碼梳理從的開始入手觀察源碼在中,對原生進行了封裝對原生的進行加工,包含原生豐富了獲取原生的對象獲取認證類對象認證認證跟進版本處理進行認證權限控制訪問頻率然后繼續跟進,調用了方法獲取認證對象進行一個一個認證,如果錯誤就觸發異常認證方法這
pip3 install djangorestframework認證源碼梳理
從rest_framework的dispatch開始入手觀察源碼
在dispatch中,對原生request進行了封裝
def dispatch(self, request, *args, **kwargs): self.args = args self.kwargs = kwargs # 對原生的request進行加工,包含【原生request】豐富了authenticator request = self.initialize_request(request, *args, **kwargs) # 獲取原生的request對象 request._request # 獲取認證類對象 request.authenticators self.request = request self.headers = self.default_response_headers # deprecate? try: # 2. 認證 self.initial(request, *args, **kwargs) .....
認證
跟進self.initial
def initial(self, request, *args, **kwargs): self.format_kwarg = self.get_format_suffix(**kwargs) """版本處理""" neg = self.perform_content_negotiation(request) request.accepted_renderer, request.accepted_media_type = neg ...... """進行認證""" self.perform_authentication(request) """權限控制""" self.check_permissions(request) """訪問頻率""" self.check_throttles(request)
然后繼續跟進,調用了.user._authenticate()方法 # 獲取認證對象進行一個一個認證,如果錯誤就觸發異常!認證方法
這是認證和視圖寫在了一起,方便觀看,實際中最好將認證類多帶帶存放在一個py中
from rest_framework.views import APIView from rest_framework import exceptions from rest_framework.authentication import BaseAuthentication # 內置的認證類【必須繼承】 class Authentication(BaseAuthentication): # 自己寫認證,然后引用 def authenticate(self, request): token = request._request.GET.get("token") token_obj = models.UserToken.objects.filter(token=token).first() if not token_obj: # 其實在內部捕捉了異常 raise exceptions.AuthenticationFailed("用戶認證失敗") # 返回user對象 + token # 在rest framework 內部會將兩個字段賦值給 request,給后面調用 """返回值必須是元祖 第一個賦值給 request.user 第二個request.auth""" return (token_obj.user, token_obj) def authenticate_header(self, request): pass ... class DogView(APIView): """ 應用上Authentication認證規則。如果有多個,那么依次認證 如果都沒有認證,那么默認值 request.user=AnonymousUser request.auth = None 匿名用戶 request.user 這是token_obj.user 源碼中規定元祖第一個 request.auth 這是token_obj 源碼中規定元祖第二個 """ authentication_classes = [Authentication, ] ......源碼流程圖 setting中配置認證類
實際中將自己寫的認證方法多帶帶放在一個py中,然后在項目setting中配置即可
# 導入自己寫的rest 認證路徑 """ 可以局部使用或者全局使用 局部: authentication_classes = [] """ REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.auth.Authentication", ], # 全局使用的認證類,也可以局部使用 "UNAUTHENTICATED_USER": None, # 匿名用戶, request.user = None "UNAUTHENTICATED_TOKEN": None, # 匿名用戶, request.auth = None }
這樣寫的好處是無需再視圖中再寫引用了,會自動按照你setting中的配置進行認證,如果指定視圖不需要認證,那么在該view中寫 authentication_classes = [] 即可
內置的認證BaseAuthentication 主要使用的就是這個
BasicAuthentication 瀏覽器內置的認證【大家了解下就是了】
剩下的就是基于django的用戶認證了
創建類: 繼承BaseAuthentication - 實現 authenticate方法
返回值 | 結果 |
---|---|
None | 執行下一個認證 |
raise | 認證失敗拋出異常 |
元祖(元素1,元素2) | 元素1=request.user; 元素2=request.auth |
全局使用
setting中配置,然后在多帶帶的py文件中寫入認證「寫入路徑」
局部使用
在視圖中 引入authentication_classes = [認證類, ]
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43159.html
摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。 官網地址目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到: Code snippets 應該永遠和創建者相關 只有認證的用戶才能夠創建snippets 只有創建者才能更新或者刪除他的snippet 沒有認...
摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。 官網地址目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到: Code snippets 應該永遠和創建者相關 只有認證的用戶才能夠創建snippets 只有創建者才能更新或者刪除他的snippet 沒有認...
摘要:另外一個字段用于儲存突出顯示的代碼的表示形式。這將確保認證用戶擁有讀寫權限,而未認證用戶只有讀的權限。唯一的限制是必須是。 官網地址目前,我們的API沒有對如 edit 或者 delect做出任何限制。我們希望有一些更加高級的功能能夠做到: Code snippets 應該永遠和創建者相關 只有認證的用戶才能夠創建snippets 只有創建者才能更新或者刪除他的snippet 沒有認...
摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...
摘要:本文主要是用來記錄自己學習的過程。其中可能會有很多自己的錯誤理解。這里主要會用到的知識有百度百科阮一峰理解架構其余請自行百度。所有的全局設置都放在的字典中。使用標準的權限,未認證的用戶只讀權限不要忘記將添加到你的中。 本文主要是用來記錄自己學習django-rest-framework的過程。其中可能會有很多自己的錯誤理解。 這里主要會用到的知識有 1. [django](https:...
閱讀 4716·2021-11-18 13:23
閱讀 903·2021-09-22 15:24
閱讀 1928·2021-09-06 15:00
閱讀 2630·2021-09-03 10:30
閱讀 1287·2021-09-02 15:15
閱讀 2074·2019-08-30 15:54
閱讀 3036·2019-08-30 15:44
閱讀 1457·2019-08-29 15:12