一、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周期控制。