drf--請求和響應


一 請求與響應

1.1 Request

REST framework 傳入視圖的request對象不再是Django默認的HttpRequest對象,而是REST framework提供的擴展了HttpRequest類的Request類的對象。

REST framework 提供了Parser解析器,在接收到請求后會自動根據Content-Type指明的請求數據類型(如JSON、表單等)將請求數據進行parse解析,解析為類字典[QueryDict]對象保存到Request對象中。

Request對象的數據是自動根據前端發送數據的格式進行解析之后的結果。

無論前端發送的哪種格式的數據,我們都可以以統一的方式讀取數據。

1.1.1.1 常用屬性

1).data

request.data 返回解析之后的請求體數據。類似於Django中標准的request.POSTrequest.FILES屬性,但提供如下特性:

  • 包含了解析之后的文件和非文件數據
  • 包含了對POST、PUT、PATCH請求方式解析后的數據
  • 利用了REST framework的parsers解析器,不僅支持表單類型數據,也支持JSON數據
2).query_params

request.query_params與Django標准的request.GET相同,只是更換了更正確的名稱而已。

1.2 Response

1
rest_framework.response.Response

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

REST framework提供了Renderer 渲染器,用來根據請求頭中的Accept(接收數據類型聲明)來自動轉換響應數據到對應格式。如果前端請求中未進行Accept聲明,則會采用默認方式處理響應數據,我們可以通過配置來修改默認響應格式。

可以在rest_framework.settings查找所有的drf默認配置項

1
2
3
4
5
6
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默認響應渲染類
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 瀏覽API渲染器
)
}

1.1.2.1 構造方式

1
Response(data, status=None, template_name=None, headers=None, content_type=None)

data數據不要是render處理之后的數據,只需傳遞python的內建類型數據即可,REST framework會使用renderer渲染器處理data

data不能是復雜結構的數據,如Django的模型類對象,對於這樣的數據我們可以使用Serializer序列化器序列化處理后(轉為了Python字典類型)再傳遞給data參數。

參數說明:

  • data: 為響應准備的序列化處理后的數據;
  • status: 狀態碼,默認200;
  • template_name: 模板名稱,如果使用HTMLRenderer 時需指明;
  • headers: 用於存放響應頭信息的字典;
  • content_type: 響應數據的Content-Type,通常此參數無需傳遞,REST framework會根據前端所需類型數據來設置該參數。

1.1.2.2 常用屬性

1).data

傳給response對象的序列化后,但尚未render處理的數據

2).status_code

狀態碼的數字

3).content

經過render處理后的響應數據

1.1.2.3 狀態碼

為了方便設置狀態碼,REST framewrok在rest_framework.status模塊中提供了常用狀態碼常量。

1)信息告知 - 1xx
1
2
HTTP_100_CONTINUE
HTTP_101_SWITCHING_PROTOCOLS
2)成功 - 2xx
1
2
3
4
5
6
7
8
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
1
2
3
4
5
6
7
8
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)客戶端錯誤 - 4xx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
1
2
3
4
5
6
7
8
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM