參考文檔
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執行個體清單。

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 類的一個子類
除非由于某種原因你要對 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
裝飾器,内部自定制的