1. 程式人生 > 實用技巧 >rest_framework請求和響應

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處理後的響應資料