国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-16 01:17:39
字體:
供稿:網(wǎng)友

前言

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

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

昨天在調(diào)試django時(shí),發(fā)現(xiàn)在 APIView 中打的斷點(diǎn)沒有斷下來,而是打在 View 中的斷點(diǎn)斷下來了,調(diào)試了很多次,最后發(fā)現(xiàn),在 django 項(xiàng)目啟動(dòng)時(shí),會(huì)首先加載 urls 中的文件,執(zhí)行 views 中類的 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è)來一個(gè) GET 請(qǐng)求,urls 和 views里面的代碼如下:

# urls.pyurl(r'^book/(?P<id>/d+)/', views.Book.as_view()),
# views.pyclass 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 里面就是一個(gè)典型的 CBV 的路由配置,在 views 中一個(gè)是路由分發(fā)方法,一個(gè)是獲取單本圖書信息(通過 id)。

as_view 具體執(zhí)行流程

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

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

查看該源碼如下:

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 汉源县| 台安县| 仙桃市| 西林县| 青铜峡市| 维西| 宜川县| 阳新县| 普宁市| 平果县| 金门县| 皮山县| 禄丰县| 潼关县| 青铜峡市| 昭平县| 烟台市| 鹤岗市| 锡林郭勒盟| 阜平县| 乡城县| 泰兴市| 伽师县| 崇左市| 佛教| 永城市| 三都| 新密市| 璧山县| 溧阳市| 武冈市| 周至县| 平邑县| 北海市| 嘉兴市| 阿克| 调兵山市| 斗六市| 海伦市| 西乡县| 青铜峡市|