drf-Request與Response

先生發表於2021-07-05

一、Request

在Rest Framework 傳入檢視的request物件已經不再是Django預設的HTTPResponse物件了,而是Rest Framework提供的Request類的物件了。

但是Request會在接受到請求後會自動根據Content-type的資料型別進行解析為[QueryDict]物件,也就是說它會自動根據前端傳送的資料格式進行解析。

原始碼分析

# from rest_framework.request import Request

def __init__(self, request, parsers=None, authenticators=None,
             negotiator=None, parser_context=None):
    # 先判斷傳入的request是不是原生的HttpResponse的物件,為了避免套娃
    assert isinstance(request, HttpRequest), (
        .format(request.__class__.__module__, request.__class__.__name__)
    )
	# 二次封裝request,將原生request作為drf request物件的 _request 屬性
    self._request = request
    
    
# 點攔截,當新request.的時候觸發
def __getattr__(self, attr):
    try:
        return getattr(self._request, attr)	# 通過反射,獲取原生request物件,取出屬性或方法
    except AttributeError:
        return self.__getattribute__(attr)

常用屬性

request.data:返回解析後的請求體資料,不僅支援表單型別資料,也支援JSON資料

request.query_params:和Django原生的request.GET相同,名字不一樣而已

@property
def query_params(self):
    return self._request.GET	# 還是原來那個

二、Response

這是Rest Framework提供的響應類,它會把資料內容轉換成符合前端的資料型別,它是根據請求頭中的Accept來自動轉換響應資料到對應格式。沒有的話就是預設的,可以通過以下配置:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  				# 預設響應渲染類
        'rest_framework.renderers.JSONRenderer',  			# json渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  	# 瀏覽API渲染器
    )
}

引數說明

# from rest_framework.response import Response

def __init__(self, data=None, status=None,
             template_name=None, headers=None,
             exception=False, content_type=None):

data:返回要被序列化的資料,字典

status:狀態碼,預設200

template:模板名稱,可以自定義模版

headers:響應頭,可以往響應頭放東西,就是一個字典

content_type:響應的編碼格式,(application/json或text/html)

常用屬性

.data:傳給response物件序列化後沒有render的資料

.status_code:狀態碼

.content:render後的響應資料

相關文章