Django REST framework API 指南(1):請求
Django REST framework API 指南(2):響應
Django REST framework API 指南(3):檢視
Django REST framework API 指南(4):通用檢視
Django REST framework API 指南(5):檢視集
Django REST framework API 指南(6):路由
Django REST framework API 指南(7):解析
Django REST framework API 指南全 27 篇地址
如果你正在開發基於 REST 的 web API 服務...... 應該忽略 request.POST。 — Malcom Tredinnick,Django 開發組
REST framework 的 Request
類擴充套件與標準的 HttpRequest
,並做了相應的增強,比如更加靈活的請求解析(request parsing)和認證(request authentication)。
Request 解析
REST framwork 的 Request
物件提供了靈活的請求解析,允許你使用 JSON data 或 其他 media types 像通常處理表單資料一樣處理請求。
.data
request.data
返回請求主題的解析內容。這跟標準的 request.POST
和 request.FILES
類似,並且還具有以下特點:
- 包括所有解析的內容,檔案(file) 和 非檔案(non-file inputs)。
- 支援解析
POST
以外的 HTTP method , 比如PUT
,PATCH
。 - 更加靈活,不僅僅支援表單資料,傳入同樣的 JSON 資料一樣可以正確解析,並且不用做額外的處理(意思是前端不管提交的是表單資料,還是 JSON 資料,
.data
都能夠正確解析)。
.data 具體操作,以後再說~
.query_params
request.query_params
等同於 request.GET
,不過其名字更加容易理解。
為了程式碼更加清晰可讀,推薦使用 request.query_params
,而不是 Django 中的 request.GET
,這樣那夠讓你的程式碼更加明顯的體現出 ----- 任何 HTTP method 型別都可能包含查詢引數(query parameters),而不僅僅只是 'GET' 請求。
.parsers
APIView
類或者 @api_view
裝飾器將根據檢視上設定的 parser_classes
或 settings
檔案中的 DEFAULT_PARSER_CLASSES
設定來確保此屬性(.parsers
)自動設定為 Parser
例項列表。
通常不需要關注該屬性......
如果你非要看看它裡面是什麼,可以列印出來看看,大概長這樣:
[<rest_framework.parsers.JSONParser object at 0x7fa850202d68>, <rest_framework.parsers.FormParser object at 0x7fa850202be0>, <rest_framework.parsers.MultiPartParser object at 0x7fa850202860>]
複製程式碼
恩,包含三個解析器 JSONParser
,FormParser
,MultiPartParser
。
注意: 如果客戶端傳送格式錯誤的內容,則訪問
request.data
可能會引發ParseError
。預設情況下, REST framework 的APIView
類或者@api_view
裝飾器將捕獲錯誤並返回400 Bad Request
響應。 如果客戶端傳送的請求內容無法解析(不同於格式錯誤),則會引發UnsupportedMediaType
異常,預設情況下會被捕獲並返回415 Unsupported Media Type
響應。
內容協商
該請求公開了一些屬性,允許你確定內容協商階段的結果。這使你可以實施一些行為,例如為不同媒體型別選擇不同的序列化方案。
.accepted_renderer
渲染器例項是由內容協商階段選擇的。
.accepted_media_type
表示內容協商階段接受的 media type 的字串。
認證(Authentication)
REST framework 提供了靈活的認證方式:
- 可以在 API 的不同部分使用不同的認證策略。
- 支援同時使用多個身份驗證策略。
- 提供與傳入請求關聯的使用者(user)和令牌(token)資訊。
.user
request.user
通常會返回 django.contrib.auth.models.User
的一個例項,但其行為取決於正在使用的身份驗證策略。
如果請求未經身份驗證,則 request.user
的預設值是 django.contrib.auth.models.AnonymousUser
的例項(就是匿名使用者)。
關於 .user
的更多內容,以後再說~
.auth
request.auth
返回任何附加的認證上下文(authentication context)。request.auth
的確切行為取決於正在使用的身份驗證策略,但它通常可能是請求經過身份驗證的令牌(token)例項。
如果請求未經身份驗證,或者沒有附加上下文(context),則 request.auth
的預設值為 None
。
關於 .auth
的更多內容,以後再說~
.authenticators
APIView
類或 @api_view
裝飾器將確保根據檢視上設定的 authentication_classes
或基於 settings
檔案中的 DEFAULT_AUTHENTICATORS
設定將此屬性(.authenticators
)自動設定為 Authentication
例項列表。
**通常不需要關注該屬性...... **
注意:呼叫
.user
或.auth
屬性時可能會引發WrappedAttributeError
異常。這些錯誤源於 authenticator 作為一個標準的AttributeError
,為了防止它們被外部屬性訪問修改,有必要重新提升為不同的異常型別。Python 無法識別來自 authenticator 的AttributeError
,並會立即假定請求物件沒有.user
或.auth
屬性。authenticator 需要修復。
多說幾句
.authenticators
其實存的就是當前使用的認證器(authenticator)列表,列印出來大概是這樣:
[<rest_framework.authentication.SessionAuthentication object at 0x7f8ae4528710>, <rest_framework.authentication.BasicAuthentication object at 0x7f8ae45286d8>]
複製程式碼
可以看到這裡使用的認證器(authenticator)包括 SessionAuthentication
和 BasicAuthentication
。
瀏覽器增強
REST framework 支援基於瀏覽器的 PUT
,PATCH
,DELETE
表單。
.method
request.method
返回請求 HTTP 方法的大寫字串表示形式。如 GET
,POST
...。
透明地支援基於瀏覽器的 PUT
,PATCH
和 DELETE
表單。
更多相關資訊以後再說~
.content_type
request.content_type
返回表示 HTTP 請求正文的媒體型別(media type)的字串物件(比如: text/plain
, text/html
等),如果沒有提供媒體型別,則返回空字串。
通常不需要直接訪問此屬性,一般都依賴與 REST 框架的預設請求解析行為。
不建議使用 request.META.get('HTTP_CONTENT_TYPE')
來獲取 content type 。
更多相關資訊以後再說~
.stream
request.stream
返回一個代表請求主體內容的流。
通常不需要直接訪問此屬性,一般都依賴與 REST 框架的預設請求解析行為。
標準的 HttpRequest 屬性
由於 REST framework 的 Request
擴充套件於 Django 的 HttpRequest
,所有其他標準屬性和方法也可用。例如request.META
和 request.session
字典都可以正常使用。
請注意,由於實現原因,Request
類不會從 HttpRequest
類繼承,而是使用組合擴充套件類(優先使用組合,而非繼承,恩,老鐵沒毛病 0.0)
最後
靠 google 翻譯加個人理解寫的,請輕點噴(好方)。
然後,打算把官網的 API 指南都過一遍,所以就打算整理成中文的,方便以後看,而且自己動手寫一遍更加便於理解,記憶。
沒看官網 tutorial 的建議先看一遍吧,有人翻譯過: Django Rest Framework 中文版教程