最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django drf請(qǐng)求模塊源碼解析

 更新時(shí)間:2021年06月08日 09:09:02   作者:Silent丿丶黑羽  
APIView中的dispatch是整個(gè)請(qǐng)求生命過(guò)程的核心方法,包含了請(qǐng)求模塊,權(quán)限驗(yàn)證,異常模塊和響應(yīng)模塊,我們先來(lái)介紹請(qǐng)求模塊,對(duì)Django drf請(qǐng)求模塊源碼相關(guān)知識(shí)感興趣的朋友一起看看吧

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

項(xiàng)目地址:

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

請(qǐng)求模塊:request對(duì)象

源碼入口

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
    )

源碼分析

源碼很簡(jiǎn)單,第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', {})
}

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

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

我們可以分析出,內(nèi)部對(duì)request做了二次封裝,_request是一個(gè)HttpRequest對(duì)象,并且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)

意思是如果這個(gè)實(shí)例上不存在一個(gè)屬性,那么我們也會(huì)嘗試將其代理到底層HttpRequest對(duì)象。接下來(lái)我們可以通過(guò)案例演示

案例演示

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

我們可以清楚的看到:

  • request是drfRequest對(duì)象
  • request下有data屬性,query_params屬性,但是沒(méi)有GET屬性

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

我們可以看到_requestWSGIHttpRequest對(duì)象,所以它會(huì)有GET屬性,所以我們視圖中打印的request.GET實(shí)際上和request._request.GET是一樣的,因?yàn)?code>request沒(méi)有GET屬性,所以它就會(huì)訪問(wèn)_request中的GET屬性,最后我們查看打印結(jié)果,如下:

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

同樣的,POST請(qǐng)求也是如此,我們?cè)谝晥D中添加POST的請(qǐng)求方式,如下:

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

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

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

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

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

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

可以看到multipart/form-data這種請(qǐng)求方式,都能打印出來(lái)

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

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

可以看到application/x-www-form-urlencoded這種請(qǐng)求方式,都能打印出來(lái)

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

可以看到application/json這種請(qǐng)求方式,只有request.data能打印出來(lái)

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

所以request.data兼容性最強(qiáng)

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

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

相關(guān)文章

  • 帶你從內(nèi)存的角度看Python中的變量

    帶你從內(nèi)存的角度看Python中的變量

    這篇文章主要為大家介紹了從內(nèi)存的角度看Python中的變量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 詳解python如何調(diào)用C/C++底層庫(kù)與互相傳值

    詳解python如何調(diào)用C/C++底層庫(kù)與互相傳值

    Python作為一門腳本解釋語(yǔ)言,本身又很好的結(jié)合C++,所以使用Python開(kāi)發(fā),在性能要求的地方調(diào)用C/C++底層庫(kù),這簡(jiǎn)直是神器。本文詳細(xì)介紹了Python調(diào)用C/C++底層庫(kù),互相傳值問(wèn)題,下面一起來(lái)看看。
    2016-08-08
  • Python基于文件內(nèi)容實(shí)現(xiàn)查找文件功能

    Python基于文件內(nèi)容實(shí)現(xiàn)查找文件功能

    無(wú)論是Linux系統(tǒng)還是Windows系統(tǒng)都有基于文件名實(shí)現(xiàn)過(guò)濾、查找的功能。但是如果想要查找一些關(guān)于某些文件指定內(nèi)容的文件,好像它們明面上沒(méi)有這樣的功能了。這個(gè)時(shí)候就可以通過(guò) Python 來(lái)實(shí)現(xiàn)這樣的功能,快跟隨小編一起學(xué)習(xí)一下吧
    2022-05-05
  • python pcm音頻添加頭轉(zhuǎn)成Wav格式文件的方法

    python pcm音頻添加頭轉(zhuǎn)成Wav格式文件的方法

    今天小編就為大家分享一篇python pcm音頻添加頭轉(zhuǎn)成Wav格式文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • 跟老齊學(xué)Python之從if開(kāi)始語(yǔ)句的征程

    跟老齊學(xué)Python之從if開(kāi)始語(yǔ)句的征程

    前面做了很多鋪墊了,真正的編程我們還沒(méi)有講過(guò),各位童鞋也許早就不耐煩了,好吧,今天我們就從if語(yǔ)句來(lái)踏上我們的征程
    2014-09-09
  • 如何從Python字符串中刪除最后一個(gè)分號(hào)或者逗號(hào)

    如何從Python字符串中刪除最后一個(gè)分號(hào)或者逗號(hào)

    這篇文章主要介紹了從?Python?中的字符串中刪除最后一個(gè)分號(hào)或者逗號(hào)的兩種方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Python素?cái)?shù)檢測(cè)實(shí)例分析

    Python素?cái)?shù)檢測(cè)實(shí)例分析

    這篇文章主要介紹了Python素?cái)?shù)檢測(cè)方法,實(shí)例分析了Python判定素?cái)?shù)的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • python getopt詳解及簡(jiǎn)單實(shí)例

    python getopt詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了 python getopt詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • python版學(xué)生管理系統(tǒng)

    python版學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python版學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Python進(jìn)度條的使用

    Python進(jìn)度條的使用

    在使用Python處理比較耗時(shí)操作的時(shí)候,為了便于觀察處理進(jìn)度,就需要通過(guò)進(jìn)度條將處理情況進(jìn)行可視化展示,本文主要介紹了Python進(jìn)度條的使用,分享給大家,感興趣的可以了解一下
    2021-05-05

最新評(píng)論

瑞安市| 新乐市| 通化市| 南丹县| 泊头市| 无极县| 桂林市| 漯河市| 白银市| 格尔木市| 遵化市| 墨玉县| 定西市| 炉霍县| 五河县| 外汇| 上饶县| 郓城县| 惠州市| 正定县| 达州市| 丰原市| 五寨县| 江阴市| 偏关县| 津市市| 漳州市| 乌兰察布市| 罗源县| 北流市| 内江市| 元谋县| 宿松县| 江口县| 香港| 韶山市| 时尚| 广宗县| 鄱阳县| 芦山县| 梧州市|