pip3 install djangorestframework
在dispatch中,對原生request進行了封裝
python
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
django
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, ] ......
實際中將本身寫的認證方法單獨放在一個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 = []
便可瀏覽器
返回值 | 結果 |
---|---|
None | 執行下一個認證 |
raise | 認證失敗拋出異常 |
元祖(元素1,元素2) | 元素1=request.user; 元素2=request.auth |
全局使用app
setting中配置,而後在單獨的py文件中寫入認證「寫入路徑」
局部使用spa
在視圖中 引入authentication_classes = [認證類, ]