天天看點

01_Request和Response

參考文檔

http://www.iamnancy.top/djangorestframework/Responses/

https://q1mi.github.io/Django-REST-framework-documentation/api-guide/requests_zh/

https://www.django-rest-framework.org/api-guide/responses/

1、Requests

1、Request類

Request類擴充了标準的HttpRequest

request.META 和 request.session 字典可以正常使用

由于實作原因,Request 類不會從 HttpRequest 類繼承,而是使用組合擴充類

2、request.data

request.data

 傳回請求主體的解析内容

比request.POST 和 request.FILES更加強大

優點如下:
它包括所有解析的内容, 包括 檔案或非檔案 輸入。
它支援解析除POST之外的HTTP方法的内容,這意味着你可以通路PUT和PATCH請求的内容。
它支援REST framework靈活的請求解析,而不僅僅支援表單資料。 
例如,你可以以與處理傳入表單資料相同的方式處理傳入的JSON資料。      

3、request.query_params

是request.GET的一個更準确的同義詞。

任何HTTP方法類型可能包括查詢參數,而不僅僅是GET請求。

4、parsers 解析器

APIView類或@api_view裝飾器将根據view中設定的parser_classes集合或基于DEFAULT_PARSER_CLASSES設定,

確定此屬性自動設定為Parser執行個體清單。

01_Request和Response

Note

1、錯誤格式:
request.data可能會引發ParseError,
APIView類或@api_view裝飾器将捕獲錯誤并傳回400 Bad Request響應

2、無法解析的類型的請求
引發 UnsupportedMediaType 異常,
該異常并傳回 415 Unsupported Media Type 響應      

5、認證器authentication

1. request.user 

request.user 通常會傳回django.contrib.auth.models.User執行個體

未經身份驗證的,預設值是django.contrib.auth.models.AnonymousUser執行個體

2. request.auth

request.auth 傳回任何附加的認證上下文

未經認證的,傳回None

3. authenticators

APIView 類或 @api_view 裝飾器将根據視圖上設定的 authentication_classes

DEFAULT_AUTHENTICATORS 設定確定将此屬性自動設定為 Authentication 執行個體清單。

調用 .user 或 .auth 屬性時可能會引發 WrappedAttributeError 異常

認證器 (authenticator) 作為标準 AttributeError

6、浏覽器增強

1. request.method

request.method傳回大寫的請求方法 PUT,PATCH 和 DELETE 表單

2. request.content_type

傳回HTTP請求正文的媒體類型的字元串對象

如果需要定義 
确實需要通路請求的内容類型,則應該優先使用 .content_type 屬性,而不是使用 request.META.get('HTTP_CONTENT_TYPE')      

3. request.stream

傳回一個代表請求主體内容的流。

2、Response響應

Response 類是 Django中 SimpleTemplateResponse 類的一個子類

01_Request和Response

除非由于某種原因你要對 REST framework 做大量的自定義,

否則你應該始終對傳回對象的views使用 APIView 類或者 @api_view 函數。

這樣做可以確定視圖在傳回之前能夠執行 content negotiation 并且為響應選擇适當的渲染器。

1、建立response

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


# 參數:
data :響應的序列化資料。
status :響應的狀态代碼。預設為200。另請參閱狀态代碼。
template_name :選擇 HTMLRenderer 時使用的模闆名稱。
headers :響應中使用的 HTTP headers 的字典。
content_type :響應的内容類型。通常情況下,渲染器會根據内容協商的結果自動設定,但有些情況下需要明确指定内容類型。      

1、restframework

Response 類使用的渲染器不能處理複雜的資料類型, 

是以需要在建立 Response 對象之前将資料序列化為基本資料類型。

您可以使用 REST framework 的 Serializer 類來執行資料序列化,或者使用您自己的自定義序列化。

2、django

與正常 HttpResponse 對象不同,您不會使用渲染的内容執行個體化 Response 對象。相反,您傳遞的是未渲染的資料,可能由任何 Python 基元組成。

例如 Django 模型執行個體,

2、屬性 Attributes

res = Response()

#res.data 
Request 對象的未渲染内容。

#res.status_code 
HTTP 響應的數字狀态碼

#res.content 
響應的渲染内容。在通路 .content 之前,必須先調用 .render() 方法。

#res.template_name 
隻有當 HTMLRenderer 或其他自定義模闆渲染器是響應的渲染器時才需要。 
比如:之前的代碼高亮顯示

#res.accepted_renderer
用于渲染響應的渲染器執行個體。 
從視圖傳回響應之前由 APIView 或 @api_view 自動設定


#res.accepted_media_type 
由 content negotiation 階段選擇的媒體類型。 
自動通過 APIView 或者 @api_view 在view傳回response之前設定 

#res.renderer_context 
将傳遞給渲染器的 .render() 方法的附加的上下文資訊的字典      

3、标準 HttpResponse 屬性

1. 設定headers

Response 類擴充了 SimpleTemplateResponse,并且響應中也提供了所有常用的屬性和方法

```python

response = Response()

response['Cache-Control'] = 'no-cache'

```

2. .render()

調用此方法将響應的序列化資料渲染為最終響應内容

調用 .render() 時,響應内容将設定為在 accepted_renderer 執行個體上調用

.render(data,accepted_media_type,renderer_context) 方法的結果。

您通常不需要自己調用 .render(),因為它是由 Django 的标準響應循環處理的。

3、總結

1、Request和Response

請求   響應
restframe   Request+序列化 序列化+Response
django HttpRequest HttpResponse

2、request.data與request.query_params

request.data POST請求
request.query_params 任何http請求,都有要查詢,不僅僅是get

3、各種解析器,渲染器,xx器

APIView

類或

@api_view

裝飾器,内部自定制的

01_Request和Response
上一篇: 02_View