Request和Response

一、request

REST framework的 Request 擴展了標準的 HttpRequest,添加支持了REST framework靈活的request解析和request認證


1.Request parsing


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

.date

request.data 返回request body的解析后的內容,這和標準的request.POST和request.FILES屬性相似,除了以下這些:

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

.query_params

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

.parsers

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

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


2.Content negotiation(內容協商)


request公開一些屬性,允許您確定內容協商階段的結果。這允許您實現為不同的媒體類型選擇不同的連載方案等行為。

.accepted_renderer

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

.accepted_media_type

一個字符串代表內容協商階段接受的媒體類型。


3.Authentication


REST framework 提供了靈活并且針對每個request的身份認證系統,他允許你實現以下功能:

  • 為你的API不同的部分選用不同的身份認證策略
  • 提供了多個身份認證使用策略
  • 通過傳入的request提供了用戶的token信息的關聯。

.user

request.user通常返回django.contrib.auth.models.User的實例,雖然這個行為取決于所使用的身份驗證策略。
如果請求是未經身份驗證的,request.user的默認值是django.contrib.auth.models.AnonymousUser的實例

For more details see the authentication documentation.

.auth

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

For more details see the authentication documentation.

.authenticators

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

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


4.瀏覽器增強


REST framework 支持一些瀏覽器增強,像基于瀏覽器的 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的媒體類型。
如果沒有提供媒體類型則返回一個空字符串。
您通常不需要直接訪問請求的內容類型,您將通常依賴于REST framework的默認請求解析行為。
如果你需要訪問請求的內容類型你應該使用.content_type屬性優先于使用request.META.get('HTTP_CONTENT_TYPE'),他提供基于瀏覽器的non-form內容的透明支持。

For more information see the browser enhancements documentation.

.stream

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

For more information see the browser enhancements documentation.


5.標準HttpRequest屬性


正如REST framework的Request擴展了Django的HttpRequest,所有其他標準的屬性和方法也可可用的,例如:request.META和request.session字典可以正常使用。

注意,由于實現原因Request 類不從HttpRequest類繼承,而是使用擴展類成分


二、response


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

Response 類繼承于Django的SimpleTemplateResponse,Response 對象被初始化為本地的Python原始數據組成的數據,REST framework使用標準的HTTP內容協商來決定怎樣渲染最后的response數據。
這里沒有要求你去使用Response 類,你可以根據需要在視圖中返回正規的HttpResponse 或者StreamingHttpResponse 對象。使用Response 類簡單的提供了一個漂亮的接口來返回協商的內容Web接口的響應,這可以被渲染成多種形式。
除非你因為一些原因還要大量定制REST framework,你應該一直在視圖中使用APIView 類或者@api_view函數返回Response 對象。這些允許視圖可以執行內容協商并為response選擇適當的渲染器。

1.Response()


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

不像正規的HttpResponse對象,你不用渲染的內容代替沒有渲染的數據實例化Response對象,這可能由一些Python的原始數據組成。(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類使用的渲染器不能在本地處理復雜的數據類型,就像Django的模型實例,所以你需要在創建Response對象之前,先把數據序列化成原始的數據類型。
你可以使用REST framework的Serializer 類來執行這些數據序列化,或者使用你自己自定義的序列化器。

參數:

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

2.屬性


.data

Request 對象沒有渲染的內容

.status_code

HTTP response的狀態碼

.content

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

.template_name

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

.accepted_renderer

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

3.標準的HttpResponse屬性


Response類擴展了SimpleTemplateResponse,所有常用的屬性和方法在response中都是可用的。例如你可以在response中用標準的方式設置headers。

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

.render()

** 參數:** .render()

與任何其他TemplateResponse一樣,這個方法被用來渲染response的序列化的數據到最后的response內容。當.render()被調用時,response的內容會被設置成在accepted_renderer實例上調用.render(data, accepted_media_type, renderer_context) 方法的結果。
你通常不需要自己調用.render(),他被django的標準的response周期控制。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容