1. 程式人生 > >DRF自帶的Request和Response物件

DRF自帶的Request和Response物件

# 轉載請留言聯絡

1.Request物件

DRF傳入檢視的request物件,不再是Django預設的HttpRequest物件,而是擴充套件了HttpRequest類的Request類的物件。

REST framework 提供了Parser解析器,在接收到請求後會自動根據Content-Type指明的請求資料型別(如JSON、表單等)將請求資料進行parse解析,解析為字典物件儲存到Request物件中。

Request物件的資料是自動根據前端傳送資料的格式進行解析之後的結果。無論前端傳送的哪種格式的資料,我們都可以以統一的方式讀取資料。

  • Request的常用屬性

1) .data

  • 包含了解析之後的檔案和非檔案資料
  • 包含了對POST、PUT、PATCH請求方式解析後的資料
  • 利用了REST framework的parsers解析器,不僅支援表單型別資料,也支援JSON資料

簡單來說,無論前端發過來的是xml還是json,請求方式無論是POST還是PUT,都可以直接用request.data直接取一個字典出來。

示例:

# 要繼承APIView(或其子類)才能取得DRF的Request和Response
class DepartmentListAPIView(APIView):
    def post(self,request):
        
""" :param request:這個request是DRF傳入檢視的request物件,不再是Django預設的HttpRequest物件。 :return: """ data = request.data print(type(data)) # 輸出結果:<class 'dict'> name = data.get("name") age = data.get("age") print(name) print(age)
return HttpResponse("for test")

 

2).query_params

與Django原來的HttpRequest的GET方法一樣,只不過換了個名字...

示例:

class DepartmentListAPIView2(APIView):
    def get(self,request):
        a = request.query_params  # 與HttpRequest物件的GET方法相同
        print(a.get("id"))
        return HttpResponse("hello")

 

2.Response物件

REST framework提供了一個響應類Response,使用該類構造響應物件時,響應的具體資料內容會被轉換(render渲染)成符合前端需求的型別。

REST framework提供了Renderer 渲染器,用來根據請求頭中的Accept(接收資料型別宣告)來自動轉換響應資料到對應格式。如果前端請求中未進行Accept宣告,則會採用預設方式處理響應資料,我們可以通過配置來修改預設響應格式。

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

Response(data, status=None, headers=None)

示例:

class DepartmentListAPIView2(APIView):
    def get(self,request):
        data=[1,2,3]
        response = Response(data=data,status=status.HTTP_200_OK,headers={"aaa":"111","bbb":"222"})  # status可以直接寫status=200
        return response

 

狀態碼附錄:

1)資訊告知-1xx

HTTP_100_CONTINUE
HTTP_101_SWITCHING_PROTOCOLS

2)成功-2xx

HTTP_200_OK
HTTP_201_CREATED
HTTP_202_ACCEPTED
HTTP_203_NON_AUTHORITATIVE_INFORMATION
HTTP_204_NO_CONTENT
HTTP_205_RESET_CONTENT
HTTP_206_PARTIAL_CONTENT
HTTP_207_MULTI_STATUS

3)重定向-3xx

HTTP_300_MULTIPLE_CHOICES
HTTP_301_MOVED_PERMANENTLY
HTTP_302_FOUND
HTTP_303_SEE_OTHER
HTTP_304_NOT_MODIFIED
HTTP_305_USE_PROXY
HTTP_306_RESERVED
HTTP_307_TEMPORARY_REDIRECT

4)客戶端錯誤

HTTP_400_BAD_REQUEST
HTTP_401_UNAUTHORIZED
HTTP_402_PAYMENT_REQUIRED
HTTP_403_FORBIDDEN
HTTP_404_NOT_FOUND
HTTP_405_METHOD_NOT_ALLOWED
HTTP_406_NOT_ACCEPTABLE
HTTP_407_PROXY_AUTHENTICATION_REQUIRED
HTTP_408_REQUEST_TIMEOUT
HTTP_409_CONFLICT
HTTP_410_GONE
HTTP_411_LENGTH_REQUIRED
HTTP_412_PRECONDITION_FAILED
HTTP_413_REQUEST_ENTITY_TOO_LARGE
HTTP_414_REQUEST_URI_TOO_LONG
HTTP_415_UNSUPPORTED_MEDIA_TYPE
HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
HTTP_417_EXPECTATION_FAILED
HTTP_422_UNPROCESSABLE_ENTITY
HTTP_423_LOCKED
HTTP_424_FAILED_DEPENDENCY
HTTP_428_PRECONDITION_REQUIRED
HTTP_429_TOO_MANY_REQUESTS
HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS

5)伺服器錯誤-5xx

HTTP_500_INTERNAL_SERVER_ERROR
HTTP_501_NOT_IMPLEMENTED
HTTP_502_BAD_GATEWAY
HTTP_503_SERVICE_UNAVAILABLE
HTTP_504_GATEWAY_TIMEOUT
HTTP_505_HTTP_VERSION_NOT_SUPPORTED
HTTP_507_INSUFFICIENT_STORAGE
HTTP_511_NETWORK_AUTHENTICATION_REQUIRED