欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django drf請求模塊源碼解析

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

DRF 框架,全稱為 Django Rest Framework,是 Django 內(nèi)置模塊的擴(kuò)展,用于創(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對象添加了上下文requestencoding

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

我們可以分析出,內(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對象。接下來我們可以通過案例演示

案例演示

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

我們可以清楚的看到:

  • request是drfRequest對象
  • request下有data屬性,query_params屬性,但是沒有GET屬性

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

我們可以看到_requestWSGIHttpRequest對象,所以它會有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)  # 拓展,兼容性最強(qiáng),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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • Python通過getattr函數(shù)獲取對象的屬性值

    Python通過getattr函數(shù)獲取對象的屬性值

    這篇文章主要介紹了Python通過getattr函數(shù)獲取對象的屬性值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Python從文件中讀取指定的行以及在文件指定位置寫入

    Python從文件中讀取指定的行以及在文件指定位置寫入

    這篇文章主要給大家介紹了關(guān)于Python從文件中讀取指定的行及在文件中指定位置寫入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python讀取csv文件并把文件放入一個list中的實例講解

    python讀取csv文件并把文件放入一個list中的實例講解

    下面小編就為大家分享一篇python讀取csv文件并把文件放入一個list中的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python中update()函數(shù)的使用方法

    python中update()函數(shù)的使用方法

    Python字典update()方法用于更新字典中的鍵/值對,可以修改存在的鍵對應(yīng)的值,也可以添加新的鍵/值對到字典中,這篇文章主要給大家介紹了關(guān)于python中update()函數(shù)的使用方法,需要的朋友可以參考下
    2024-02-02
  • python實現(xiàn)單張圖像拼接與批量圖片拼接

    python實現(xiàn)單張圖像拼接與批量圖片拼接

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)單張圖像拼接與批量圖片拼接,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • python處理PHP數(shù)組文本文件實例

    python處理PHP數(shù)組文本文件實例

    這篇文章主要介紹了python處理PHP數(shù)組文本文件實例,本文的PHP數(shù)組文本是多個redis數(shù)據(jù)庫的配置文件,需求是提取相關(guān)參數(shù)組合成Shell命令,需要的朋友可以參考下
    2014-09-09
  • Python中可變和不可變對象的深入講解

    Python中可變和不可變對象的深入講解

    python與C/C++不一樣,它的變量使用有自己的特點,學(xué)python的時候一定要記住一切皆為對象,一切皆為對象的引用,這篇文章主要給大家介紹了關(guān)于Python中可變和不可變對象的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • Python正則表達(dá)式總結(jié)分享

    Python正則表達(dá)式總結(jié)分享

    這篇文章主要介紹了Python正則表達(dá)式總結(jié)分享,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例,需要的朋友可以參考一下
    2022-03-03
  • Python中TCP協(xié)議的探索與實例解析

    Python中TCP協(xié)議的探索與實例解析

    網(wǎng)絡(luò)編程在當(dāng)今數(shù)字化世界中扮演著至關(guān)重要的角色,本文將帶你深入了解 Python 中的 TCP 協(xié)議,介紹網(wǎng)絡(luò)編程的基礎(chǔ)知識,并提供豐富的示例代碼,希望對大家有所幫助
    2023-12-12
  • Python I/O與進(jìn)程的詳細(xì)講解

    Python I/O與進(jìn)程的詳細(xì)講解

    今天小編就為大家分享一篇關(guān)于Python I/O與進(jìn)程的詳細(xì)講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論