Django REST framework API 指南(1):請求
Django REST framework API 指南(2):響應
Django REST framework API 指南(3):檢視
Django REST framework API 指南(4):通用檢視
Django REST framework API 指南(5):檢視集
Django REST framework API 指南(6):路由
Django REST framework API 指南(7):解析
Responses
與基本的 HttpResponse 物件不同,TemplateResponse 物件保留了檢視提供的用於計算響應的上下文的詳細資訊。直到需要時才會計算最終的響應輸出,也就是在後面的響應過程中進行計算。 — Django 文件
REST framework 通過提供一個 Response
類來支援 HTTP 內容協商,該類允許你根據客戶端請求返回不同的表現形式(如: JSON ,HTML 等)。
Response
類是 Django 的 SimpleTemplateResponse
的子類。Response
物件使用資料進行初始化,資料應由 Python 物件(native Python primitives)組成。然後 REST framework 使用標準的 HTTP 內容協商來確定它應該如何渲染最終響應的內容。
當然,您也可以不使用 Response
類,直接返回常規 HttpResponse
或 StreamingHttpResponse
物件。 使用 Response
類只是提供了一個更好的互動方式,它可以返回多種格式。
除非由於某種原因需要大幅度定製 REST framework ,否則應該始終對返回 Response
物件的檢視使用 APIView
類或 @api_view
裝飾器。這樣做可以確保檢視執行內容協商,並在檢視返回之前為響應選擇適當的渲染器。
建立 response
Response()
與普通 HttpResponse
物件不同,您不會使用渲染的內容例項化 Response
物件。相反,您傳遞的是未渲染的資料,可能包含任何 Python 物件。
由於 Response
類使用的渲染器不能處理複雜的資料型別(比如 Django 的模型例項),所以需要在建立 Response
物件之前將資料序列化為基本的資料型別。
你可以使用 REST framework 的 Serializer
類來執行序列化的操作,也可以用自己的方式來序列化。
構造方法: Response(data, status=None, template_name=None, headers=None, content_type=None)
引數:
data
: 響應的序列化資料。status
: 響應的狀態程式碼。預設為200。template_name
: 選擇HTMLRenderer
時使用的模板名稱。headers
: 設定 HTTP header,字典型別。content_type
: 響應的內容型別,通常渲染器會根據內容協商的結果自動設定,但有些時候需要手動指定。
屬性
.data
還沒有渲染,但已經序列化的響應資料。
.status_code
狀態碼
.content
將會返回的響應內容,必須先呼叫 .render()
方法,才能訪問 .content
。
.template_name
只有在 response 的渲染器是 HTMLRenderer
或其他自定義模板渲染器時才需要提供。
.accepted_renderer
用於將會返回的響應內容的渲染器例項。
從檢視返回響應之前由 APIView
或 @api_view
自動設定。
.accepted_media_type
內容協商階段選擇的媒體型別。
從檢視返回響應之前由 APIView
或 @api_view
自動設定。
.renderer_context
將傳遞給渲染器的 .render()
方法的附加的上下文資訊字典。
從檢視返回響應之前由 APIView
或 @api_view
自動設定。
標準 HttpResponse 屬性
Response
類擴充套件於 SimpleTemplateResponse
,並且響應中也提供了所有常用的屬性和方法。例如,您可以用標準方式在響應中設定 header:
response = Response()
response['Cache-Control'] = 'no-cache'
複製程式碼
.render()
與其他任何 TemplateResponse
一樣,呼叫此方法將響應的序列化資料呈現為最終響應內容。響應內容將設定為在 accepted_renderer
例項上呼叫 .render(data,accepted_media_type,renderer_context)
方法的結果。
通常不需要自己呼叫 .render()
,因為它是由 Django 處理的。