av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

Django drf請求模塊源碼解析

瀏覽:49日期:2024-09-04 16:12:05

DRF 框架,全稱為 Django Rest Framework,是 Django 內(nèi)置模塊的擴展,用于創(chuàng)建標(biāo)準(zhǔn)化 RESTful API;它利用 ORM 映射數(shù)據(jù)庫,并自定義序列化數(shù)據(jù)進(jìn)行返回,多用于前后端分離項目

項目地址:

https://github.com/encode/django-rest-framework

請求模塊:request對象

源碼入口

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),我們進(jìn)入方法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 { ’view’: self, ’args’: getattr(self, ’args’, ()), ’kwargs’: getattr(self, ’kwargs’, {})}

上面的代碼的意思是:返回一個解析的字典以便于Parser.parse()去解析,另外還通過Request對象添加了上下文request和encoding

第二句返回了一個Request對象,點擊進(jìn)入查看

Django drf請求模塊源碼解析

我們可以分析出,內(nèi)部對request做了二次封裝,_request是一個HttpRequest對象,并且Request類中還有__getattr__此方法,代碼如下:

def __getattr__(self, attr): ''' If an attribute does not exist on this instance, then we also attempt to proxy it to the underlying HttpRequest object. ''' try:return getattr(self._request, attr) except AttributeError:return self.__getattribute__(attr)

意思是如果這個實例上不存在一個屬性,那么我們也會嘗試將其代理到底層HttpRequest對象。接下來我們可以通過案例演示

案例演示

Django drf請求模塊源碼解析

我們創(chuàng)建了TestView視圖,視圖函數(shù)中打印了3個request屬性,并且在response上打了一個斷點,接下來通過url訪問視圖,進(jìn)入斷點如下,

Django drf請求模塊源碼解析

我們可以清楚的看到:

request是drf的Request對象 request下有data屬性,query_params屬性,但是沒有GET屬性

上面還有一個Protected Attributes屬性,里面包含了_request屬性

Django drf請求模塊源碼解析

我們可以看到_request是WSGIHttpRequest對象,所以它會有GET屬性,所以我們視圖中打印的request.GET實際上和request._request.GET是一樣的,因為request沒有GET屬性,所以它就會訪問_request中的GET屬性,最后我們查看打印結(jié)果,如下:

<QueryDict: {’a’: [’1’]}><QueryDict: {’a’: [’1’]}><QueryDict: {’a’: [’1’]}>

同樣的,POST請求也是如此,我們在視圖中添加POST的請求方式,如下:

def post(self, request, *args, **kwargs): print(request.POST) # 兼容 print(request._request.POST) # 二次封裝 print(request.data) # 拓展,兼容性最強,3種請求方式都可以 return Response('drf post ok')

我們都知道提交數(shù)據(jù)一般有3種方式

multipart/form-data application/x-www-form-urlencoded application/json

首先我們使用multipart/form-data提交請求數(shù)據(jù),并請求API

Django drf請求模塊源碼解析

我們查看pycharm打印結(jié)果

<QueryDict: {’a’: [’1’]}><QueryDict: {’a’: [’1’]}><QueryDict: {’a’: [’1’]}>

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

接著我們使用application/x-www-form-urlencoded提交請求數(shù)據(jù),并請求API

Django drf請求模塊源碼解析

<QueryDict: {’a’: [’1’]}><QueryDict: {’a’: [’1’]}><QueryDict: {’a’: [’1’]}>

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

最后我們使用application/json提交請求數(shù)據(jù),并請求API

Django drf請求模塊源碼解析

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

<QueryDict: {}><QueryDict: {}>{’a’: 1}

所以request.data兼容性最強

總結(jié)drf對request進(jìn)行了二次封裝,request._request就是原生的WSGIRequest原生request的屬性和方法都可以被drf的request對象直接訪問(兼容)drf請求的所有url拼接參數(shù)均被解析到query_params中,所有的數(shù)據(jù)包均被解析到data中其中post請求,request.data的兼容性最強,能兼容前臺傳輸?shù)膉son格式的數(shù)據(jù)

到此這篇關(guān)于Django(48)drf請求模塊源碼分析 的文章就介紹到這了,更多相關(guān)Django drf源碼內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 久久影院一区 | 国产精品视频在线观看 | 久久69精品久久久久久久电影好 | 久久精品一级 | 天天操夜夜拍 | 亚洲一区二区三区四区视频 | av一区二区三区四区 | 精品日韩一区二区 | 久久亚 | 国产精品美女久久久久久免费 | 国产激情综合五月久久 | 久久黄视频 | 国产精品日韩欧美一区二区 | 免费看爱爱视频 | 二区在线观看 | 欧美偷偷操 | 97久久久久久久久 | 毛片黄片免费看 | 欧美国产精品 | 精品欧美乱码久久久久久 | 欧美日韩在线高清 | 国产精品久久久久无码av | 人人叉| 91精品国产91久久久久久密臀 | 成人午夜影院 | 一区二区三区四区视频 | 五月天婷婷综合 | 免费一级欧美在线观看视频 | 美女三区 | 亚洲一区二区三区欧美 | 午夜免费观看体验区 | 91免费高清视频 | 国产精品18hdxxxⅹ在线 | 一区二区激情 | 午夜国产 | 中文字幕在线观看一区 | 偷拍亚洲色图 | 国产在线麻豆精品入口 | 日韩欧美在线观看视频 | 成人精品一区亚洲午夜久久久 | 日本免费黄色 |