1. 程式人生 > >REST framework 中的 Request 和 Response

REST framework 中的 Request 和 Response

Request

from rest_framework.request import Request

REST framework 中的request和Django中的HttpRequest的是不一樣的,它是繼承於SimpleTemplateResponse, 而SimpleTemplateResponse是繼承於HttpResponse的。

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

Request物件的資料是自動根據前端傳送資料的格式進行解析之後的結果。

無論前端傳送的哪種格式的資料,我們都可以以統一的方式讀取資料。

常用屬性:

  1. data :
    request.data 是進行解析之後獲取到的請求體的資料,和Django中的request.post, request.files 的獲取結果類似;但是還包含了以下特性:
  • 包含了解析之後的檔案和非檔案資料
  • 包含了對POST、PUT、PATCH請求方式解析後的資料
  • 利用了REST framework的parsers解析器,不僅支援表單型別資料,也支援JSON資料
  1. query_params
    request.query_params與Django標準的request.GET相同,只是更換了更正確的名稱而已。

Response

from rest_framework.response import 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的使用方式(引數以及如何讓傳遞):

Response(data, status=None, template_name=None, headers=None, content_type=None)
  • data: 為響應準備的序列化處理後的資料;
  • status: 狀態碼,預設200;
  • template_name:模板名稱,如果使用HTMLRenderer 時需指明
  • headers: 用於存放響應頭資訊的字典;
  • content_type:響應資料的
  • Content-Type,通常此引數無需傳遞,REST framework會根據前端所需型別資料來設定該引數

data資料不要是render處理之後的資料,只需傳遞python的內建型別資料即可,REST framework會使用renderer渲染器處理data。

data不能是複雜結構的資料,如Django的模型類物件,對於這樣的資料我們可以使用Serializer序列化器序列化處理後(轉為了Python字典型別)再傳遞給data引數。

常用引數:

  1. .data: data資料是沒有進行render之前的資料;
  2. .content: 這個和data是相反的,它是進行render之後的資料,這個資料和前端獲取的資料是一樣的
  3. .status_code : 狀態碼

常用狀態碼常量

  1. 資訊告知 - 1xx

HTTP_100_CONTINUE
HTTP_101_SWITCHING_PROTOCOLS

  1. 成功 - 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

  1. 重定向 - 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

  1. 客戶端錯誤 - 4xx

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

  1. 伺服器錯誤 - 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