Rest framework中Request屬性詳解

REST framework的Request類擴展自標準的HttpRequest,增加了REST framework靈活的請求解析和請求驗證支持。


請求解析

REST framework的Request對象提供了靈活的請求解析,讓你可以像一般處理普通form數據一樣處理帶JSON數據或者媒體類型的request。

.data

request.data返回request body解析後的內容。這類似於標準的request.POSTrequest.FILES屬性除了下面幾個區別:

  • 它包含了所有解析後的內容,包括文件類型和非文件類型的輸入
  • 它支持除了POST類型以外的其他HTTP方法的內容解析,意味着你可以訪問PUTPATCH類型reqeust的內容。
  • 它提供REST framework靈活的請求解析,而不單單支持from數據。舉例說你可以像處理form數據一樣處理JSON數據。
    詳細信息,參考parsers documentation

.query_params

request.query_params 是比request.GET更貼切的一個同義詞
爲了清楚起見,在你的代碼裏,我們推薦你使用request.query_params來代替Django's標準request.GET。這樣做可以讓你的代碼更準確和明瞭-任何HTTP方法類型都可能包含查詢信息,不緊緊是GET請求。

.parsers

APIView類或者@api_view 裝飾器將保證這個屬性會被自動賦予一系列的Parser實例,基於這個view的parser_class集合或者基於DEFAULT_PARSER_CLASSES設置
你一般不會訪問這個屬性


如果一個客戶端發送了有缺陷的內容,那麼訪問request.data也許會引起ParseError。默認情況下REST framework的APIView類或者@api_view裝飾器將會捕獲這個錯誤然後返回400 Bad Request的response

如果一個客戶端發送了一個包含有不能解析的content-type那麼將會引起一個UnsupportedMediaType異常,這個異常將會被捕獲並且返回一個415 Unsupported Media Type response


內容協商

request暴漏了一些屬性是允許你去判斷內容協商階段的結果。這將允許你去實現一些行爲比如給不同的媒體類型選擇一個不同的序列化方案

.accepted_renderer

內容協商階段選出來的渲染器實例

.accepted_media_type

是一個字符串用來表明內容協商階段接受的媒體類型


驗證

REST framework提供了靈活的,針對每一個請求的驗證,可以給你的這樣的能力:

  • 不同部分的API使用不同的驗證策略
  • 支持使用多個驗證策略
  • 同時提供即將到來的request相關的user和token信息

.user

request.user一般返回django.contrib.auth.models.User的一個實例,儘管它的行爲取決於你使用的驗證策略。
如果request沒有驗證,那麼request.user的默認值的jdango.contrib.auth.models.AnonymousUser
更多信息,查看authentication documentation

.auth

request.auth返回任何額外的授權上下文。reqeust.auth的具體行爲取決於使用的認證策略,但一般來說它會是reqeuset請求授權得到token的實例。
更多詳細信息請看 authentication documentation

.authenticators

APIView類或者@api_view裝飾器將會保證這個屬性被自動設置爲一列Authentication的實例,基於authentication_classes集合或者基於DEFAULT_AUTHENTICATORS設置。
你一般不需要訪問這個屬性


瀏覽器增強

REST framework支持一些瀏覽器增強比如說是基於瀏覽器的PUT,PATCH和DELETE表單

.method

request.method返回請求的HTTP方法大寫的字符串表達。
基於瀏覽器PUT,PATCH,DELETE表單被支持

.content_type

request.content_type,返回一個代表HTTP請求body媒體類型的字符串對象,或者一個空串如果沒有媒體類型提供的話。你一般不需要直接訪問請求的內容類型,因爲一般來說你會基於REST框架的默認解析行爲
如果你確實需要訪問request的媒體類型,你應該使用.content_type屬性優先於使用request.META.get('HTTP_CONTENT_TYPE'),因爲它提供基於瀏覽器的非form內容。
.stream
request.stream返回request body的流的展現方式
你一般不會直接訪問request的內容,因爲你一般會基於REST 框架的默認請求解析實現


標準HttpRequest屬性

因爲REST framework的Request類擴展自Django's的HttpRequest,所有其他的標準的屬性和方法都是可用的。舉例來說request.METArequest.session字典都和之前一樣
注意因爲實現的原因,Request類不是直接繼承子HttpRequest類,而是使用組合擴展了它

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章