與基本的HttpResponse對(duì)象不同, TemplateResponse 對(duì)象保留view提供的上下文的詳細(xì)信息以計(jì)算 response. Response的最終輸出直到它在稍后的響應(yīng)過(guò)程中被需要才會(huì)計(jì)算。— Django 文檔
REST framework 通過(guò)提供一個(gè) Response 類來(lái)支持 HTTP content negotiation,該類允許你返回可以呈現(xiàn)為多種內(nèi)容類型的內(nèi)容,具體取決于客戶端的請(qǐng)求。
Response 類是 Django中 SimpleTemplateResponse 類的一個(gè)子類。Response 對(duì)象用Python基本數(shù)據(jù)類型初始化。 然后REST framework 使用標(biāo)準(zhǔn)的HTTP content negotiation 來(lái)確定如何呈現(xiàn)最終的響應(yīng)內(nèi)容。
你并不需要一定是用 Response 類,你可以從你的視圖返回常規(guī)的 HttpResponse 或者 StreamingHttpResponse 對(duì)象。使用Response類只提供了一個(gè)可以呈現(xiàn)多種格式的更好的界面來(lái)返回 content-negotiated 的 Web API 響應(yīng)。
除非由于某種原因你要對(duì) REST framework 做大量的自定義,否則你應(yīng)該始終對(duì)返回對(duì)象的views使用 APIView 類或者 @api_view 函數(shù)。這樣做可以確保視圖在返回之前能夠執(zhí)行 content negotiation 并且為響應(yīng)選擇適當(dāng)?shù)匿秩酒鳌?/p>
簽名: Response(data, status=None, template_name=None, headers=None, content_type=None)
與常規(guī)的 HttpResponse 對(duì)象不同,你不能使用渲染內(nèi)容來(lái)實(shí)例化一個(gè) Response 對(duì)象,而是傳遞未渲染的數(shù)據(jù),包含任何Python基本數(shù)據(jù)類型。
Response 類使用的渲染器無(wú)法自行處理像 Django model 實(shí)例這樣的復(fù)雜數(shù)據(jù)類型,因此你需要在創(chuàng)建 Response 對(duì)象之前將數(shù)據(jù)序列化為基本數(shù)據(jù)類型。
你可以使用 REST framework的 Serializer 類來(lái)執(zhí)行此類數(shù)據(jù)的序列化,或者使用你自定義的來(lái)序列化。
參數(shù):
Request 對(duì)象的未渲染內(nèi)容。
HTTP 響應(yīng)的數(shù)字狀態(tài)嗎。
response的呈現(xiàn)內(nèi)容。 .render() 方法必須先調(diào)用才能訪問(wèn) .content 。
template_name 只有在使用 HTMLRenderer 或者其他自定義模板作為response的渲染器時(shí)才需要提供該屬性。
將用于呈現(xiàn)response的render實(shí)例。
自動(dòng)通過(guò) APIView 或者 @api_view 在view返回response之前設(shè)置。
由 content negotiation 階段選擇的媒體類型。
自動(dòng)通過(guò) APIView 或者 @api_view 在view返回response之前設(shè)置。
一個(gè)將傳遞給渲染器的.render()方法的附加上下文信息字典。
自動(dòng)通過(guò) APIView 或者 @api_view 在view返回response之前設(shè)置。
Response 類擴(kuò)展了 SimpleTemplateResponse,并且所有常用的屬性和方法都是提供的。比如你可以使用標(biāo)準(zhǔn)的方法設(shè)置response的header信息:
response = Response()
response['Cache-Control'] = 'no-cache'
Signature: .render()
和其他的 TemplateResponse 一樣,調(diào)用該方法將response的序列化數(shù)據(jù)呈現(xiàn)為最終的response內(nèi)容。 當(dāng) .render() 被調(diào)用時(shí), response的內(nèi)容將被設(shè)置成在 accepted_renderer實(shí)例上調(diào)用 .render(data, accepted_media_type, renderer_context) 方法返回的結(jié)果。
你通常并不需要自己調(diào)用 .render() ,因?yàn)樗怯蒁jango的標(biāo)準(zhǔn)響應(yīng)周期來(lái)處理的。
更多建議: