Django REST framework API 指南(2):響應

wcode發表於2018-02-28

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 類,直接返回常規 HttpResponseStreamingHttpResponse 物件。 使用 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 處理的。

相關文章