DRF 3 請求響應異常處理

2022-05-15 08:13:23 字數 4818 閱讀 1713

from rest_framework.request import request
rest framework 傳入檢視的request物件不再是django預設的httprequest物件,而是rest framework提供的擴充套件了httprequest類的request類的物件。

rest framework 提供了parser解析器,在接收到請求後會自動根據content-type指明的請求資料型別(如json、表單等)將請求資料進行parse解析,解析為類字典[querydict]物件儲存到request物件中。

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

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

request常用屬性

1).data

request.data返回解析之後的請求體資料。類似於django中標準的request.postrequest.files屬性,但提供如下特性:

2).query_params

request.query_params與django標準的request.get相同,只是更換了更正確的名稱而已。

3).請求頭的資料

ip位址和token都在http的請求頭里

request.meta.get('http_remote_addr') 取ip位址

request.meta.get('http_authorization') 取token

補充:django源生request的使用

1.獲取請求路徑中的查詢字串引數,可以通過request.get屬性獲取,返回querydict物件

2.前端傳送的表單型別的請求體資料,可以通過request.post屬性獲取,返回querydict物件

3.非表單型別的請求體資料,django無法自動解析,可以通過request.body屬性獲取原始資料自己處理

4.可以通過request.meta屬性獲取請求頭headers中的資料

5.httprequest物件的屬性get、post都是querydict型別的物件

​ 方法get():根據鍵獲取值,如果乙個鍵同時擁有多個值將獲取最後乙個值

​ 方法getlist():根據鍵獲取值,值以列表返回,可以獲取指定鍵的所有值

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

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

可以在rest_framework.settings查詢所有的drf預設配置項

rest_framework =
使用
response(data, status=none, template_name=none, headers=none, content_type=none)
data資料不要是render處理之後的資料,只需傳遞python的內建型別資料即可,rest framework會使用renderer渲染器處理data

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

引數說明:

response的常用屬性

1).data

傳給response物件的序列化後,但尚未render處理的資料

2).status_code

狀態碼的數字

3).content

經過render處理後的響應資料

狀態碼為了方便設定狀態碼,rest framewrok在rest_framework.status模組中提供了常用狀態碼常量。

1)資訊告知 - 1xx

2)成功 - 2xx

3)重定向 - 3xx

4)客戶端錯誤 - 4xx

5)伺服器錯誤 - 5xx

自定義response

class apiresponse(response):

def __init__(self,code=100,msg='成功',data=none,status=none,headers=none,**kwargs):

dic =

if data:

dic =

dic.update(kwargs)

super().__init__(data=dic, status=status,headers=headers)

# 自己封裝的引數,code,msg,data都會被放進乙個字典中,然後將該字典打包傳個drf的response的data

# code是指自定義的狀態碼,為了說明使用者的操作結果,瀏覽器不會根據它做出反應,是寫在data裡的

# status是伺服器處理狀態碼,瀏覽器會根據該狀態碼做出反應,一般不需要手動填寫

drf源生異常處理

這是drf的settings的配置,若要更改預設配置需要在專案的settings裡重新配置.

'exception_handler': 'rest_framework.views.exception_handler',
原始碼:

return none前後端分離的專案,如果出現異常,drf能處理的異常非常有限,剩下的全部交由django處理,但是django的處理方式非常不友好,返回的不是json格式(這不符合restfull規範),我們要做的就是自定義乙個異常處理器捕獲這些異常,並返回json格式.

自定義異常處理

作用:

1,捕獲其他異常,輸出為json格式使其符合restfull規範

2,記錄日誌

自定義異常

# 自定義異常處理的方法

from rest_framework.views import exception_handler

from rest_framework.response import apiresponse # 自定義包裝的response

from rest_framework import status

def my_exception_handler(exc, context):

response=exception_handler(exc, context)

# 兩種情況,乙個是none,drf沒有處理

#response物件,django處理了,但是處理的不符合咱們的要求

if not response: #drf沒處理的情況,還可以更細力度的捕獲異常

else: # drf處理的異常,我們包裝一下格式

# 全域性配置setting.py

DRF之異常處理元件

看乙個簡單的示例 class apierror exception pass class student2apiview apiview def get self,request,pk try instance student.objects.get pk pk except student.doe...

DRF請求和響應,以及Response物件重新封裝

rest framework下的request類原始碼分析 self.request request 原生request def getattr self,attr 通過反射,將原生request物件,以及屬性和方法取出 try return getattr self.request,attr ex...

3 簡單的AJAX傳送請求和處理響應

xmlhttprequest物件可以從server端取回的資料分為兩種,雖然在http協議的角度來看都是純文字格式,但乙個是普通的文字字串,其響應的content type是text plain,可以用xmlhttprequest.responsetext屬性取得這個string,另外乙個是xml格...