Django REST framework API 指南(1):請求

wcode發表於2018-02-28

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.POSTrequest.FILES 類似,並且還具有以下特點:

  • 包括所有解析的內容,檔案(file) 和 非檔案(non-file inputs)。
  • 支援解析 POST 以外的 HTTP method , 比如 PUTPATCH
  • 更加靈活,不僅僅支援表單資料,傳入同樣的 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_classessettings 檔案中的 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>]
複製程式碼

恩,包含三個解析器 JSONParserFormParserMultiPartParser

注意: 如果客戶端傳送格式錯誤的內容,則訪問 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)包括 SessionAuthenticationBasicAuthentication

瀏覽器增強

REST framework 支援基於瀏覽器的 PUTPATCHDELETE 表單。

.method

request.method 返回請求 HTTP 方法的大寫字串表示形式。如 GET,POST...。

透明地支援基於瀏覽器的 PUTPATCHDELETE 表單。

更多相關資訊以後再說~

.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.METArequest.session 字典都可以正常使用。

請注意,由於實現原因,Request 類不會從 HttpRequest 類繼承,而是使用組合擴充套件類(優先使用組合,而非繼承,恩,老鐵沒毛病 0.0)

最後

靠 google 翻譯加個人理解寫的,請輕點噴(好方)。

然後,打算把官網的 API 指南都過一遍,所以就打算整理成中文的,方便以後看,而且自己動手寫一遍更加便於理解,記憶。

沒看官網 tutorial 的建議先看一遍吧,有人翻譯過: Django Rest Framework 中文版教程

相關文章