一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Django restframework 源碼分析之認證詳解

Django restframework 源碼分析之認證詳解

2021-06-01 00:01Eurekaa Python

這篇文章主要介紹了Django-restframework 源碼分析之認證詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

最近學習了 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里面的代碼如下:

?
1
2
3
# urls.py
 
url(r'^book/(?p<id>\d+)/', views.book.as_view()),
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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 源碼分析之認證詳解

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/zuanzuan/p/10412165.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人精品mv视频在线观看 | 久久五月综合婷婷中文云霸高清 | 国产精品久久久久久久久免费 | 免费91麻豆精品国产自产在线观看 | 三星w699 | 青青草原在线 | 国产成人综合视频 | 女医学护士一级毛片 | 日韩在线观看网址 | 丁香六月色婷婷综合网 | 青草青草视频 | 穆挂英风流艳史小说 | 国产99视频精品免视看7 | 好大好硬好深好爽想要小雪 | 美女用手扒自己下部 | 国产福利兔女郎在线观看 | 视频二区 素人 制服 国产 | 亚洲精品国产综合久久一线 | 国产免费又粗又猛又爽视频国产 | 草莓丝瓜芭乐樱桃榴莲色多黄 | 波多野结衣 在线 | 婷婷精品进入 | 国产在线观看99 | 亚洲欧美日韩成人一区在线 | tube69中国露脸 | 性一交一乱一伧老太 | 好紧好爽的午夜寂寞视频 | 激情婷婷成人亚洲综合 | 国产大秀视频 | 男人使劲躁女人小视频 | 五月性 | 欧美日韩国产亚洲一区二区三区 | 深夜福利在线播放 | 福利片福利一区二区三区 | 69福利区 | 黄网在线观看免费网站台湾swag | 青青青在线免费 | 古代翁熄乩伦小说h | 国产三级自拍视频 | 日本阿v精品视频在线观看 日本xxx片免费高清在线 | 欧美一级特黄aaa大片 |