Request和Response

一、request

REST framework的 Request 擴(kuò)展了標(biāo)準(zhǔn)的 HttpRequest,添加支持了REST framework靈活的request解析和request認(rèn)證


1.Request parsing


REST framework的Request對象提供了靈活的request解析,允許你用JSON數(shù)據(jù)或者其他的媒體類型處理request,和通常處理表單數(shù)據(jù)一樣 。

.date

request.data 返回request body的解析后的內(nèi)容,這和標(biāo)準(zhǔn)的request.POST和request.FILES屬性相似,除了以下這些:

  • 它包含所有的解析的內(nèi)容,包括file和non-file輸入。
  • 他提供對HTTP方法的內(nèi)容的解析不止于POST,這意味著你可以存取基于PUT和PATCH的內(nèi)容的request。
  • 相對于只支持表單數(shù)據(jù),他提供了對REST framework靈活的request解析,例如你可以用處理表單數(shù)據(jù)一樣的方式處理JSON數(shù)據(jù)

.query_params

request.query_params是對于request.GET更準(zhǔn)確的命名同義詞,為清楚起見,在你的代碼中,我們建議使用request.query_params來代替Django標(biāo)準(zhǔn)的request.GET。這樣能夠讓你的代碼庫更正確和清晰,可能包括任何的HTTP方法類型查詢參數(shù),而不止于GET request.

.parsers

APIView類或@api_view裝飾將確保這個屬性將自動設(shè)置為Parser的實(shí)例列表,根據(jù)parser_classes設(shè)置視圖或基于DEFAULT_PARSER_CLASSES設(shè)置。
通常你不需要訪問該屬性。

注意:
如果一個客戶端發(fā)送畸形的內(nèi)容,然后訪問request.data,可能會導(dǎo)致一個ParseError,默認(rèn)情況下 REST framework 的
APIView類或@api_view裝飾將捕獲錯誤并返回一個400錯誤請求響應(yīng)。
如果一個客戶端發(fā)送一個請求的內(nèi)容類型不能解析,將拋出UnsupportedMediaType異常,默認(rèn)情況下將被捕獲并返回一個415 Unsupported Media Type 響應(yīng)。


2.Content negotiation(內(nèi)容協(xié)商)


request公開一些屬性,允許您確定內(nèi)容協(xié)商階段的結(jié)果。這允許您實(shí)現(xiàn)為不同的媒體類型選擇不同的連載方案等行為。

.accepted_renderer

The renderer instance what was selected by the content negotiation stage.(渲染器實(shí)例選擇的內(nèi)容協(xié)商階段)

.accepted_media_type

一個字符串代表內(nèi)容協(xié)商階段接受的媒體類型。


3.Authentication


REST framework 提供了靈活并且針對每個request的身份認(rèn)證系統(tǒng),他允許你實(shí)現(xiàn)以下功能:

  • 為你的API不同的部分選用不同的身份認(rèn)證策略
  • 提供了多個身份認(rèn)證使用策略
  • 通過傳入的request提供了用戶的token信息的關(guān)聯(lián)。

.user

request.user通常返回django.contrib.auth.models.User的實(shí)例,雖然這個行為取決于所使用的身份驗(yàn)證策略。
如果請求是未經(jīng)身份驗(yàn)證的,request.user的默認(rèn)值是django.contrib.auth.models.AnonymousUser的實(shí)例

For more details see the authentication documentation.

.auth

request.auth返回任何額外的身份認(rèn)證環(huán)境(context),request.auth具體的行為取決于使用的身份認(rèn)證策略,但是他通常是一個request身份認(rèn)證的token實(shí)例
如果request未經(jīng)身份驗(yàn)證,或者沒有額外的環(huán)境,request.auth的默認(rèn)值為None。

For more details see the authentication documentation.

.authenticators

APIView類或@api_view裝飾將確保這個屬性將自動設(shè)置為ofAuthentication實(shí)例列表,根據(jù)authentication_classes設(shè)置視圖或基于DEFAULT_AUTHENTICATORS設(shè)置。

通常你不需要訪問該屬性。


4.瀏覽器增強(qiáng)


REST framework 支持一些瀏覽器增強(qiáng),像基于瀏覽器的 PUT, PATCH 和 DELETE 形式。

.method

request.method返回request的HTTP方法的大寫字符串表示。
基于瀏覽器的PUT,PATCH和DELETE形式是透明支持的。

For more information see the browser enhancements documentation.

.content_type

request.content_type 返回一個字符串對象代表HTTP的request body的媒體類型。
如果沒有提供媒體類型則返回一個空字符串。
您通常不需要直接訪問請求的內(nèi)容類型,您將通常依賴于REST framework的默認(rèn)請求解析行為。
如果你需要訪問請求的內(nèi)容類型你應(yīng)該使用.content_type屬性優(yōu)先于使用request.META.get('HTTP_CONTENT_TYPE'),他提供基于瀏覽器的non-form內(nèi)容的透明支持。

For more information see the browser enhancements documentation.

.stream

request.stream返回一個代表request body 內(nèi)容的流。
你通常不需要直接的訪問request的內(nèi)容,你將通常依賴于REST framework的默認(rèn)請求解析行為。
如果你需要直接訪問原始內(nèi)容,您應(yīng)該使用.stream屬性優(yōu)先于使用request.content。他提供基于瀏覽器的non-form內(nèi)容的透明支持。

For more information see the browser enhancements documentation.


5.標(biāo)準(zhǔn)HttpRequest屬性


正如REST framework的Request擴(kuò)展了Django的HttpRequest,所有其他標(biāo)準(zhǔn)的屬性和方法也可可用的,例如:request.META和request.session字典可以正常使用。

注意,由于實(shí)現(xiàn)原因Request 類不從HttpRequest類繼承,而是使用擴(kuò)展類成分


二、response


REST framework 靠提供Response 類來支持HTTP內(nèi)容協(xié)商,這個類允許你返回可以被渲染多種內(nèi)容類型的的內(nèi)容,具體類型取決于客戶端的請求。

Response 類繼承于Django的SimpleTemplateResponse,Response 對象被初始化為本地的Python原始數(shù)據(jù)組成的數(shù)據(jù),REST framework使用標(biāo)準(zhǔn)的HTTP內(nèi)容協(xié)商來決定怎樣渲染最后的response數(shù)據(jù)。
這里沒有要求你去使用Response 類,你可以根據(jù)需要在視圖中返回正規(guī)的HttpResponse 或者StreamingHttpResponse 對象。使用Response 類簡單的提供了一個漂亮的接口來返回協(xié)商的內(nèi)容Web接口的響應(yīng),這可以被渲染成多種形式。
除非你因?yàn)橐恍┰蜻€要大量定制REST framework,你應(yīng)該一直在視圖中使用APIView 類或者@api_view函數(shù)返回Response 對象。這些允許視圖可以執(zhí)行內(nèi)容協(xié)商并為response選擇適當(dāng)?shù)匿秩酒鳌?/p>

1.Response()


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

不像正規(guī)的HttpResponse對象,你不用渲染的內(nèi)容代替沒有渲染的數(shù)據(jù)實(shí)例化Response對象,這可能由一些Python的原始數(shù)據(jù)組成。(Unlike regular HttpResponse objects, you do not instantiate Response objects with rendered content. Instead you pass in unrendered data, which may consist of any Python primitives.)

Response類使用的渲染器不能在本地處理復(fù)雜的數(shù)據(jù)類型,就像Django的模型實(shí)例,所以你需要在創(chuàng)建Response對象之前,先把數(shù)據(jù)序列化成原始的數(shù)據(jù)類型。
你可以使用REST framework的Serializer 類來執(zhí)行這些數(shù)據(jù)序列化,或者使用你自己自定義的序列化器。

參數(shù):

  • data:為response序列化的數(shù)據(jù)
  • status:為響應(yīng)狀態(tài)代碼。默認(rèn)為200。 See also status codes。
  • template_name:如果選用HTMLRenderer ,為使用的模板名稱。
  • headers:response中使用的HTTP頭的字典。
  • content_type:response中內(nèi)容的類型。通常這回被內(nèi)容協(xié)商的渲染器設(shè)置成自動,但是這可能有一些原因你需要顯式地指定內(nèi)容類型。

2.屬性


.data

Request 對象沒有渲染的內(nèi)容

.status_code

HTTP response的狀態(tài)碼

.content

response的渲染的內(nèi)容,在訪問.content之前必須先調(diào)用.render()方法。

.template_name

如果提供template_name,只需要HTMLRenderer 或者其他自定義模板渲染器是response接受的渲染器。

.accepted_renderer

用來渲染response的渲染器實(shí)例
在視圖中返回response之前被APIView 或者@api_view立即設(shè)置為自動。

3.標(biāo)準(zhǔn)的HttpResponse屬性


Response類擴(kuò)展了SimpleTemplateResponse,所有常用的屬性和方法在response中都是可用的。例如你可以在response中用標(biāo)準(zhǔn)的方式設(shè)置headers。

response = Response()
response['Cache-Control'] = 'no-cache'

.render()

** 參數(shù):** .render()

與任何其他TemplateResponse一樣,這個方法被用來渲染response的序列化的數(shù)據(jù)到最后的response內(nèi)容。當(dāng).render()被調(diào)用時,response的內(nèi)容會被設(shè)置成在accepted_renderer實(shí)例上調(diào)用.render(data, accepted_media_type, renderer_context) 方法的結(jié)果。
你通常不需要自己調(diào)用.render(),他被django的標(biāo)準(zhǔn)的response周期控制。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容