溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django restframework之認證的示例分析

發布時間:2021-08-30 13:54:56 來源:億速云 閱讀:178 作者:小新 欄目:開發技術

小編給大家分享一下Django restframework之認證的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

啟動項目時

在調試django時,發現在 APIView 中打的斷點沒有斷下來,而是打在 View 中的斷點斷下來了,調試了很多次,最后發現,在 django 項目啟動時,會首先加載 urls 中的文件,執行 views 中類的 as_view方法,其實是繼承自 APIView 的,APIView 繼承自 django 原生 View 的as_view 方法。

里面一個參數叫 pattern_name,對應的值是admin:auth_group_change,如下圖所示:

Django restframework之認證的示例分析

目前還不清楚這里面的具體流程是什么,但是并不妨礙閱讀之后的源碼,在這只要清楚一點,在 Django 項目啟動時,路由所對應的CBV里面的相關方法的內存地址已經獲取到。這樣做的好處就是提高效率,壞處可能有一點點,會提升性能的消耗。

具體路由和邏輯代碼

在這里假設來一個 GET 請求,urls 和 views里面的代碼如下:

# urls.py

url(r'^book/(?P<id>\d+)/', views.Book.as_view()),
# views.py
class Book(APIView):

  def dispatch(self, request, *args, **kwargs):
    return super().dispatch(request, *args, **kwargs)

  def get(self, request, id):

    response = {'status': 100, 'msg': None}

    book = models.Book.objects.filter(pk=id).first()
    book_ser = BookSerib(book, many=False)
    print('book_ser.data', book_ser.data)
    response['books'] = book_ser.data
    response['msg'] = '獲取圖書成功'
    print('response', response)
    return Response(response)

urls 里面就是一個典型的 CBV 的路由配置,在 views 中一個是路由分發方法,一個是獲取單本圖書信息(通過 id)。

as_view 具體執行流程

在項目啟動時,相應的函數內存地址已經獲取到,那么具體是怎么獲取到的呢?

在上面的代碼中可以看到 Book 類是繼承自 APIView 類的,所以在路由配置里面執行的 as_view 方法如果 Book 類沒有重寫,那么執行的就是按照 mro 列表順序查找到的第一個方法,在這里執行的是 APIView 類中的 as_view 方法。

查看該源碼如下:

Django restframework之認證的示例分析

APIView 類的父類是 View 類,查看該類的 as_view 方法,源碼如下:

Django restframework之認證的示例分析

具體 as_view 就是將 view 函數的內存地址返回,以便請求來時直接調用。

initkwargs 這個參數應該是由 django 內部傳的一些參數,如下所示:

Django restframework之認證的示例分析

請求到來時

因為經過 django 先執行了 as_view 返回 view 的內存地址,所以會直接執行 view 函數,如下:

Django restframework之認證的示例分析

在這里該 self 由于是 繼承自 APIView 類的 Book 類的對象,所以 dispatch 方法首先去自身找,之后去父類找,在 APIView 類中找到 dispatch 方法,源碼如下:

Django restframework之認證的示例分析

initialize_request方法:

源碼如下:

Django restframework之認證的示例分析

在實例化 Request 對象時, authenticators 參數需要在認證時使用,所以先把這個參數的值找出來。步驟如下:

調用 self.get_authenticators

Django restframework之認證的示例分析

找到 self.authentication_classes

Django restframework之認證的示例分析

找到 api_settings,才能找到DEFAULT_AUTHENTICATION_CLASSES

Django restframework之認證的示例分析

DEFAULT和IMPORT_STRINGS參數

DEFAULT參數

Django restframework之認證的示例分析

IMPORT_STRINGS參數

Django restframework之認證的示例分析

實例化 APISettings 對象

Django restframework之認證的示例分析

通過__getattr__方法獲取值

Django restframework之認證的示例分析

執行perform_import方法

Django restframework之認證的示例分析

執行import_from_string

Django restframework之認證的示例分析

執行import_module

Django restframework之認證的示例分析

執行_bootstrap._gcd_import

Django restframework之認證的示例分析

執行_sanity_check

Django restframework之認證的示例分析

_sanity_check返回,執行_find_and_load方法

Django restframework之認證的示例分析

所以通過__getattr__的到的是一個列表,里面是兩個類,分別是[rest_framework_authentication_SessionAuthentication, rest_framework_authentication_BasicAuthentication]

到這里,initialize_request方法執行結束,得到一個經過 Request 類實例化的 request 對象,該對象里面含有原生 request 對象,可以通過 request._request 取到。

initial 方法:

源碼如下:

Django restframework之認證的示例分析

這里傳入的 request 參數是經過 Request 封裝后的參數

執行get_format_suffix

Django restframework之認證的示例分析

執行完這個方法, self_format_kwarg = None ,

執行perform_content_negotiation

Django restframework之認證的示例分析

執行self.get_renders

Django restframework之認證的示例分析

執行self.get_content_negotiator

Django restframework之認證的示例分析

執行 conneg.select_renderer方法

Django restframework之認證的示例分析

以上是“Django restframework之認證的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女