最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django restframework 源碼分析之認(rèn)證詳解

 更新時(shí)間:2019年02月22日 08:25:07   作者:Eurekaa  
這篇文章主要介紹了Django-restframework 源碼分析之認(rèn)證詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言

最近學(xué)習(xí)了 django 的一個(gè) restframework 框架,對(duì)于里面的執(zhí)行流程產(chǎn)生了興趣,經(jīng)過(guò)昨天一晚上初步搞清楚了執(zhí)行流程(部分方法還不太清楚),于是想詳細(xì)的總結(jié)一下當(dāng)來(lái)一個(gè)請(qǐng)求時(shí),在該框架里面是如何執(zhí)行的?

啟動(dòng)項(xiàng)目時(shí)

昨天在調(diào)試django時(shí),發(fā)現(xiàn)在 APIView 中打的斷點(diǎn)沒(méi)有斷下來(lái),而是打在 View 中的斷點(diǎn)斷下來(lái)了,調(diào)試了很多次,最后發(fā)現(xiàn),在 django 項(xiàng)目啟動(dòng)時(shí),會(huì)首先加載 urls 中的文件,執(zhí)行 views 中類(lèi)的 as_view方法,其實(shí)是繼承自 APIView 的,APIView 繼承自 django 原生 View 的as_view 方法。

里面一個(gè)參數(shù)叫 pattern_name,對(duì)應(yīng)的值是admin:auth_group_change,如下圖所示:

目前還不清楚這里面的具體流程是什么,但是并不妨礙閱讀之后的源碼,在這只要清楚一點(diǎn),在 Django 項(xiàng)目啟動(dòng)時(shí),路由所對(duì)應(yīng)的CBV里面的相關(guān)方法的內(nèi)存地址已經(jīng)獲取到。這樣做的好處就是提高效率,壞處可能有一點(diǎn)點(diǎn),會(huì)提升性能的消耗。

具體路由和邏輯代碼

在這里假設(shè)來(lái)一個(gè) GET 請(qǐng)求,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'] = '獲取圖書(shū)成功'
    print('response', response)
    return Response(response)

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

as_view 具體執(zhí)行流程

在項(xiàng)目啟動(dòng)時(shí),相應(yīng)的函數(shù)內(nèi)存地址已經(jīng)獲取到,那么具體是怎么獲取到的呢?

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

查看該源碼如下:

APIView 類(lèi)的父類(lèi)是 View 類(lèi),查看該類(lèi)的 as_view 方法,源碼如下:

具體 as_view 就是將 view 函數(shù)的內(nèi)存地址返回,以便請(qǐng)求來(lái)時(shí)直接調(diào)用。

initkwargs 這個(gè)參數(shù)應(yīng)該是由 django 內(nèi)部傳的一些參數(shù),如下所示:

請(qǐng)求到來(lái)時(shí)

因?yàn)榻?jīng)過(guò) django 先執(zhí)行了 as_view 返回 view 的內(nèi)存地址,所以會(huì)直接執(zhí)行 view 函數(shù),如下:

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

initialize_request方法:

源碼如下:

在實(shí)例化 Request 對(duì)象時(shí), authenticators 參數(shù)需要在認(rèn)證時(shí)使用,所以先把這個(gè)參數(shù)的值找出來(lái)。步驟如下:

調(diào)用 self.get_authenticators

找到 self.authentication_classes

找到 api_settings,才能找到DEFAULT_AUTHENTICATION_CLASSES

DEFAULT和IMPORT_STRINGS參數(shù)

DEFAULT參數(shù)

IMPORT_STRINGS參數(shù)

實(shí)例化 APISettings 對(duì)象

通過(guò)__getattr__方法獲取值

執(zhí)行perform_import方法

執(zhí)行import_from_string

執(zhí)行import_module

執(zhí)行_bootstrap._gcd_import

執(zhí)行_sanity_check

_sanity_check返回,執(zhí)行_find_and_load方法

所以通過(guò)__getattr__的到的是一個(gè)列表,里面是兩個(gè)類(lèi),分別是[rest_framework_authentication_SessionAuthentication, rest_framework_authentication_BasicAuthentication]

到這里,initialize_request方法執(zhí)行結(jié)束,得到一個(gè)經(jīng)過(guò) Request 類(lèi)實(shí)例化的 request 對(duì)象,該對(duì)象里面含有原生 request 對(duì)象,可以通過(guò) request._request 取到。

initial 方法:

源碼如下:

這里傳入的 request 參數(shù)是經(jīng)過(guò) Request 封裝后的參數(shù)

執(zhí)行g(shù)et_format_suffix

執(zhí)行完這個(gè)方法, self_format_kwarg = None ,

執(zhí)行perform_content_negotiation

執(zhí)行self.get_renders

執(zhí)行self.get_content_negotiator

執(zhí)行 conneg.select_renderer方法

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python 3.8.3 安裝配置圖文教程

    python 3.8.3 安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了python 3.8.3 安裝配置圖文教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Python+OpenCV實(shí)戰(zhàn)之實(shí)現(xiàn)文檔掃描

    Python+OpenCV實(shí)戰(zhàn)之實(shí)現(xiàn)文檔掃描

    這篇文章主要為大家詳細(xì)介紹了Python+Opencv如何實(shí)現(xiàn)文檔掃描的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-09-09
  • python重寫(xiě)方法和重寫(xiě)特殊構(gòu)造方法

    python重寫(xiě)方法和重寫(xiě)特殊構(gòu)造方法

    這篇文章主要介紹了python重寫(xiě)方法和重寫(xiě)特殊構(gòu)造方法,對(duì)于父類(lèi)的方法,只要他不符合子類(lèi)模擬的實(shí)物的行為,都可以進(jìn)行重寫(xiě),更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Python繪制圣誕樹(shù)+落葉+雪花+背景音樂(lè)+浪漫彈窗?五合一版圣誕樹(shù)

    Python繪制圣誕樹(shù)+落葉+雪花+背景音樂(lè)+浪漫彈窗?五合一版圣誕樹(shù)

    馬上不就到圣誕節(jié)了嘛,我看到朋友圈里很多小伙伴再紛紛炫耀自己收到的專(zhuān)屬圣誕樹(shù),今天小編給大家介紹的是通過(guò)Python繪制的五合一版圣誕樹(shù):圣誕樹(shù)+落葉+雪花+背景音樂(lè)+浪漫彈窗。感興趣的小伙伴快來(lái)學(xué)習(xí)一下吧
    2021-12-12
  • python 批量修改/替換數(shù)據(jù)的實(shí)例

    python 批量修改/替換數(shù)據(jù)的實(shí)例

    今天小編就為大家分享一篇python 批量修改/替換數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 利用python numpy+matplotlib繪制股票k線(xiàn)圖的方法

    利用python numpy+matplotlib繪制股票k線(xiàn)圖的方法

    這篇文章主要介紹了利用python numpy+matplotlib繪制股票k線(xiàn)圖的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 淺談Python之Django

    淺談Python之Django

    這篇文章主要介紹了Python3中的Django,小編覺(jué)得這篇文章寫(xiě)的還不錯(cuò),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧,希望能夠給你帶來(lái)幫助
    2021-10-10
  • selenium獲取當(dāng)前頁(yè)面的url、源碼、title的方法

    selenium獲取當(dāng)前頁(yè)面的url、源碼、title的方法

    這篇文章主要介紹了selenium獲取當(dāng)前頁(yè)面的url、源碼、title的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Python刪除視頻的某一段并保留其他時(shí)間段

    Python刪除視頻的某一段并保留其他時(shí)間段

    moviepy是一個(gè)非常強(qiáng)大的視頻處理庫(kù),可以輕松進(jìn)行視頻剪切、合并、添加特效等操作,本文我們就來(lái)使用moviepy實(shí)現(xiàn)刪除視頻的某一段并保留其他時(shí)間段吧
    2024-11-11
  • 利用Python腳本批量生成SQL語(yǔ)句

    利用Python腳本批量生成SQL語(yǔ)句

    這篇文章主要介紹了利用Python腳本批量生成SQL語(yǔ)句,具有很好對(duì)參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03

最新評(píng)論

太康县| 达孜县| 瑞昌市| 卓资县| 广饶县| 云安县| 黑山县| 资兴市| 新邵县| 隆林| 义马市| 鄂温| 桂阳县| 社旗县| 文山县| 西安市| 长沙县| 轮台县| 广丰县| 井冈山市| 岑巩县| 岳阳县| 富源县| 利津县| 察隅县| 剑阁县| 南江县| 博白县| 铜陵市| 梁山县| 乐昌市| 大连市| 东光县| 通化市| 绥中县| 曲水县| 肥城市| 凯里市| 柘城县| 怀远县| 左权县|