Django drf請求模組原始碼解析

2022-09-25 16:06:11 字數 2723 閱讀 9806

drf 框架,全稱為 django rest framework,是 djangwww.cppcns.como 內建模組的擴充套件,用於建立標準化 restful api;它利用 orm 對映資料庫,並自定義序列化資料進行返回,多用於前後端分離專案

專案位址:

原始碼入口

apiview類中dispatch方法中的:request=self.iniialize_request(*args, **kwargs),原始碼如下:

def initialize_request(self, request, *args, **kwargs):

"""returns the initial request object.

"""parser_context = self.get_parser_context(request)

return request(

request,

parsers=self.get_parsers(),

authenticators=self.get_authenticators(),

negotiator=self.get_content_negotiator(),

parser_context=parser_context

)原始碼分析

原始碼很簡單,第1句parser_context = self.get_parser_context(request),我們進入方法get_parser_context檢視原始碼:

"""returns a dict that is passed through to parser.parse(),

as the `parser_context` keyword argument.

"""# note: additionally `request` and `encoding` will also be added

# to the context by the request object.

return )

}上面的**的意思是:返回乙個解析的字典以便於parser.parse()去解析,另外還通過request物件新增了上下文request和encoding

第二句返回了乙個request物件,點選進入檢視

我們可以分析出,內部對request做了二次封裝,_request是乙個httprequest物件,並且request類中還有__getattr__此方法,**如下:

意思是如果這個例項上不存在乙個屬性,那麼我們也會嘗試將其**到底層httprequest物件。接下來我們可以通過案例演示

案例演示

我們建立了testview檢視,檢視函式中列印了3個request屬性,並且在response上打了乙個斷點,接下來通過url訪問檢視,進入斷點如下,

我們可以清楚的看到:

上面還有乙個protected attributes屬性,裡面包含了_request屬性

我們可以看到_request是wsgihttprequest物件,所以它會有get屬性,所以我們檢視中列印的request.get實際上和request._request.get是一樣的,因為request沒有get屬性,所以它就會訪問_request中的get屬性,最後我們檢視列印結果,如下:

同樣的,post請求也是如此,我們在檢視中新增post的請求方式,如下:

def post(self, request, *args, **kwargs):

print(request.post) # 相容

print(request._request.post) # 二次封裝

print(request.data) # 拓展,相容性最強,3種請求方式都可以

return response("drf post ok")

我們都知道提交資料一般有3種方式

首先我們使用multipart/form-data提交請求資料,並請求api

我們檢視pycharm列印結果

可以看到multipart/form-data這種請求方式,都能列印出來

接著我們使用application/x-www-form-urlencoded提交請求資料,並請求api

可以看到application/x-www-form-urlencoded這種請求方式,都能列印出來

最後我們使用application/json提交請求資料,並請求api

可以看到application/json這種請求方式,只有request.data能列印出來

所以request.data相容性最強

總結drf對request進行了二次封裝,request._request就是原生的wsgirequest原生request的屬性和方法都可以被drf的request物件直接訪問(相容)drf請求的所有url拼接引數均被解析到query_params中,所有的資料報均被解析到data中其中post請求,request.data的相容性最強,能相容前台傳輸的json格式的資料

Mybatis中Logging模組的原始碼分析

週末又來到了公司吹吹空調,順便記錄下mybatis的點點滴滴。首先mybatis不定義日誌系統,完全依賴於第三方系統完成日誌記錄,利用介面卡模式完成實際操作,原始碼如下 1 定義乙個log介面,具有如下方法 public inte ce log2 然後引入第三方日誌,比如 loggingimpl,實...

Python bisect模組的使用與原始碼分析

本文基於python3.7分析 bisect提供了六個方法 不難發現,bisect 方法和bisect right 方法以及insort 方法和insort right 方法功能一致,在下面原始碼分析中會有解釋 import bisect l 1,2,4,4,5 n 4 idx1 bisect.bi...

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...