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...