一、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後的響應資料