rest_framework請求和響應
目錄
請求物件Request
from rest_framework.request import Request
# 該Request沒有繼承django原生的HttpRequest
REST framework 傳入檢視的request物件不再是Django預設的HttpRequest物件,而是REST framework提供的擴充套件了HttpRequest類的Request類的物件。
REST framework 提供了Parser解析器,在接收到請求後會自動根據Content-Type指明的請求資料型別(如JSON、表單等)將請求資料進行parse解析,解析為類字典[QueryDict]物件儲存到Request
Request物件的資料是自動根據前端傳送資料的格式進行解析之後的結果。
無論前端傳送的哪種格式的資料,我們都可以以統一的方式讀取資料。
- 常用屬性
request.data 字典
返回解析之後的請求體資料。類似於Django中標準的request.POST和request.FILES屬性,但提供如下特性:
包含了解析之後的檔案和非檔案資料
包含了對POST、PUT、PATCH請求方式解析後的資料
利用了REST framework的parsers解析器,不僅支援表單型別資料,也支援JSON資料
request.query_params
request.query_params與Django標準的request.GET相同,只是更換了更正確的名稱而已。
@property
def query_params(self):
return self._request.GET
補充: drf的Request物件可以呼叫django原生的request物件的屬性和方法 這是因為drf的Request類用_request屬性封裝了原生django的request
這是因為drf的Request類重寫了__getattr__方法,代理了原生了request
self._request = request # request是django原生的request def __getattr__(self, attr): # 當呼叫的屬性不存在時觸發__getattr__() return getattr(self._request, attr)
請求物件Response
from rest_framework.response import Response
# 該Response繼承了django原生的HttpResponse
REST framework提供了一個響應類Response
,使用該類構造響應物件時,響應的具體資料內容會被轉換(render渲染)成符合前端需求的型別。
REST framework提供了Renderer
渲染器,用來根據請求頭中的Accept
(接收資料型別宣告)來自動轉換響應資料到對應格式。如果前端請求中未進行Accept宣告,則會採用預設方式處理響應資料,我們可以通過配置來修改預設響應格式。
可以在rest_framework.settings查詢所有的drf預設配置項
# 構造方式
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,使用如常量用更加見名知意
from rest_framework import status
HTTP_100_CONTINUE = 100
HTTP_200_OK = 200
HTTP_201_CREATED = 201
。。。。。
- template_name 渲染的模板名字(自定製模板),不需要了解
- headers:響應頭,可以往響應頭放東西,就是一個字典
- content_type:響應的編碼格式,application/json和text/html;
# 瀏覽器響應成瀏覽器的格式,postman響應成json格式,通過配置實現的(預設配置)
#不管是postman還是瀏覽器,都返回json格式資料
# drf有預設的配置檔案---》先從專案的setting中找,找不到,採用預設的
# drf的配置資訊,先從自己類中找--》專案的setting中找---》預設的找
-區域性使用:對某個檢視類有效
-在檢視類中寫如下
from rest_framework.renderers import JSONRenderer
renderer_classes=[JSONRenderer,]
-全域性使用:全域性的檢視類,所有請求,都有效
-在專案的setting.py中加入如下
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 預設響應渲染類
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 瀏覽API渲染器,如果註釋這一行使用瀏覽器開啟介面的時候就不會有模板渲染
)
}
data
資料不是render處理之後的資料,只需傳遞python的內建型別資料即可,REST framework會使用renderer
渲染器處理data
。
data
不能是複雜結構的資料,如Django的模型類物件,對於這樣的資料我們可以使用Serializer
序列化器序列化處理後(轉為了Python字典型別)再傳遞給data
引數。
- Response物件屬性(瞭解)
# response.data
傳給response物件的序列化後,但尚未render處理的資料
# response.status_code
狀態碼的數字
# response.content
經過render處理後的響應資料