REST framework的Request
類擴展自標準的HttpRequest
,增加了REST framework靈活的請求解析和請求驗證支持。
請求解析
REST framework的Request
對象提供了靈活的請求解析,讓你可以像一般處理普通form數據一樣處理帶JSON數據或者媒體類型的request。
.data
request.data
返回request body解析後的內容。這類似於標準的request.POST
和request.FILES
屬性除了下面幾個區別:
- 它包含了所有解析後的內容,包括文件類型和非文件類型的輸入
- 它支持除了
POST
類型以外的其他HTTP方法的內容解析,意味着你可以訪問PUT
和PATCH
類型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.META
和request.session
字典都和之前一樣
注意因爲實現的原因,Request類不是直接繼承子HttpRequest類,而是使用組合擴展了它