国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Django Rest Framework 認(rèn)證功能-源碼分析及使用技巧

20171112 / 2146人閱讀

摘要:認(rèn)證源碼梳理從的開始入手觀察源碼在中,對(duì)原生進(jìn)行了封裝對(duì)原生的進(jìn)行加工,包含原生豐富了獲取原生的對(duì)象獲取認(rèn)證類對(duì)象認(rèn)證認(rèn)證跟進(jìn)版本處理進(jìn)行認(rèn)證權(quán)限控制訪問頻率然后繼續(xù)跟進(jìn),調(diào)用了方法獲取認(rèn)證對(duì)象進(jìn)行一個(gè)一個(gè)認(rèn)證,如果錯(cuò)誤就觸發(fā)異常認(rèn)證方法這

pip3 install djangorestframework
認(rèn)證源碼梳理

從rest_framework的dispatch開始入手觀察源碼

在dispatch中,對(duì)原生request進(jìn)行了封裝

def dispatch(self, request, *args, **kwargs):
    self.args = args
    self.kwargs = kwargs
    # 對(duì)原生的request進(jìn)行加工,包含【原生request】豐富了authenticator
    request = self.initialize_request(request, *args, **kwargs)
    # 獲取原生的request對(duì)象 request._request
    # 獲取認(rèn)證類對(duì)象 request.authenticators
    self.request = request
    self.headers = self.default_response_headers  # deprecate?
    
    try:
        # 2. 認(rèn)證
        self.initial(request, *args, **kwargs)
    .....

認(rèn)證

跟進(jìn)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
    ......

    """進(jìn)行認(rèn)證"""
    self.perform_authentication(request)
    """權(quán)限控制"""
    self.check_permissions(request)
    """訪問頻率"""
    self.check_throttles(request)
然后繼續(xù)跟進(jìn),調(diào)用了.user._authenticate()方法  # 獲取認(rèn)證對(duì)象進(jìn)行一個(gè)一個(gè)認(rèn)證,如果錯(cuò)誤就觸發(fā)異常!
認(rèn)證方法
這是認(rèn)證和視圖寫在了一起,方便觀看,實(shí)際中最好將認(rèn)證類多帶帶存放在一個(gè)py中
from rest_framework.views import APIView
from rest_framework import exceptions
from rest_framework.authentication import BaseAuthentication  # 內(nèi)置的認(rèn)證類【必須繼承】

class Authentication(BaseAuthentication): # 自己寫認(rèn)證,然后引用
    def authenticate(self, request):
        token = request._request.GET.get("token")
        token_obj = models.UserToken.objects.filter(token=token).first()
        if not token_obj:
            # 其實(shí)在內(nèi)部捕捉了異常
            raise exceptions.AuthenticationFailed("用戶認(rèn)證失敗")

        # 返回user對(duì)象 + token
        # 在rest framework 內(nèi)部會(huì)將兩個(gè)字段賦值給 request,給后面調(diào)用
        """返回值必須是元祖 第一個(gè)賦值給 request.user  第二個(gè)request.auth"""
        return (token_obj.user, token_obj) 

    def authenticate_header(self, request):
        pass
        ...

class DogView(APIView):
    """
    應(yīng)用上Authentication認(rèn)證規(guī)則。如果有多個(gè),那么依次認(rèn)證
    如果都沒有認(rèn)證,那么默認(rèn)值 request.user=AnonymousUser  request.auth = None  匿名用戶
    request.user  這是token_obj.user 源碼中規(guī)定元祖第一個(gè)
    request.auth  這是token_obj  源碼中規(guī)定元祖第二個(gè)
    """
    authentication_classes = [Authentication, ]
    ......
源碼流程圖

setting中配置認(rèn)證類
實(shí)際中將自己寫的認(rèn)證方法多帶帶放在一個(gè)py中,然后在項(xiàng)目setting中配置即可
# 導(dǎo)入自己寫的rest 認(rèn)證路徑
"""
可以局部使用或者全局使用    
局部: authentication_classes = [] 
"""
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.auth.Authentication", ],  # 全局使用的認(rèn)證類,也可以局部使用
    "UNAUTHENTICATED_USER": None,  # 匿名用戶, request.user = None
    "UNAUTHENTICATED_TOKEN": None,  # 匿名用戶, request.auth = None
}

這樣寫的好處是無需再視圖中再寫引用了,會(huì)自動(dòng)按照你setting中的配置進(jìn)行認(rèn)證,如果指定視圖不需要認(rèn)證,那么在該view中寫 authentication_classes = [] 即可

內(nèi)置的認(rèn)證

BaseAuthentication 主要使用的就是這個(gè)

BasicAuthentication 瀏覽器內(nèi)置的認(rèn)證【大家了解下就是了】

剩下的就是基于django的用戶認(rèn)證了


使用總結(jié)

創(chuàng)建類: 繼承BaseAuthentication - 實(shí)現(xiàn) authenticate方法

返回值 結(jié)果
None 執(zhí)行下一個(gè)認(rèn)證
raise 認(rèn)證失敗拋出異常
元祖(元素1,元素2) 元素1=request.user; 元素2=request.auth

全局使用

setting中配置,然后在多帶帶的py文件中寫入認(rèn)證「寫入路徑」

局部使用

在視圖中 引入authentication_classes = [認(rèn)證類, ]

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43159.html

相關(guān)文章

  • django rest framework個(gè)人學(xué)習(xí)筆記(六)————Tutorial4.認(rèn)證于授權(quán)

    摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶擁有讀寫權(quán)限,而未認(rèn)證用戶只有讀的權(quán)限。唯一的限制是必須是。 官網(wǎng)地址目前,我們的API沒有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到: Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān) 只有認(rèn)證的用戶才能夠創(chuàng)建snippets 只有創(chuàng)建者才能更新或者刪除他的snippet 沒有認(rèn)...

    eternalshallow 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(六)————Tutorial4.認(rèn)證于授權(quán)

    摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶擁有讀寫權(quán)限,而未認(rèn)證用戶只有讀的權(quán)限。唯一的限制是必須是。 官網(wǎng)地址目前,我們的API沒有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到: Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān) 只有認(rèn)證的用戶才能夠創(chuàng)建snippets 只有創(chuàng)建者才能更新或者刪除他的snippet 沒有認(rèn)...

    MonoLog 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(六)————Tutorial4.認(rèn)證于授權(quán)

    摘要:另外一個(gè)字段用于儲(chǔ)存突出顯示的代碼的表示形式。這將確保認(rèn)證用戶擁有讀寫權(quán)限,而未認(rèn)證用戶只有讀的權(quán)限。唯一的限制是必須是。 官網(wǎng)地址目前,我們的API沒有對(duì)如 edit 或者 delect做出任何限制。我們希望有一些更加高級(jí)的功能能夠做到: Code snippets 應(yīng)該永遠(yuǎn)和創(chuàng)建者相關(guān) 只有認(rèn)證的用戶才能夠創(chuàng)建snippets 只有創(chuàng)建者才能更新或者刪除他的snippet 沒有認(rèn)...

    caozhijian 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(一)————Install

    摘要:本文主要是用來記錄自己學(xué)習(xí)的過程。其中可能會(huì)有很多自己的錯(cuò)誤理解。這里主要會(huì)用到的知識(shí)有百度百科阮一峰理解架構(gòu)其余請(qǐng)自行百度。所有的全局設(shè)置都放在的字典中。使用標(biāo)準(zhǔn)的權(quán)限,未認(rèn)證的用戶只讀權(quán)限不要忘記將添加到你的中。 本文主要是用來記錄自己學(xué)習(xí)django-rest-framework的過程。其中可能會(huì)有很多自己的錯(cuò)誤理解。 這里主要會(huì)用到的知識(shí)有 1. [django](https:...

    yuxue 評(píng)論0 收藏0
  • django rest framework個(gè)人學(xué)習(xí)筆記(一)————Install

    摘要:本文主要是用來記錄自己學(xué)習(xí)的過程。其中可能會(huì)有很多自己的錯(cuò)誤理解。這里主要會(huì)用到的知識(shí)有百度百科阮一峰理解架構(gòu)其余請(qǐng)自行百度。所有的全局設(shè)置都放在的字典中。使用標(biāo)準(zhǔn)的權(quán)限,未認(rèn)證的用戶只讀權(quán)限不要忘記將添加到你的中。 本文主要是用來記錄自己學(xué)習(xí)django-rest-framework的過程。其中可能會(huì)有很多自己的錯(cuò)誤理解。 這里主要會(huì)用到的知識(shí)有 1. [django](https:...

    yagami 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<