13

爲什麼Django REST Framework實現與內置Django機制不同的身份驗證機制?爲什麼Django REST Framework提供了不同的身份驗證機制

要機智,有一個可配置兩個設置類:

  1. settings.AUTHENTICATION_BACKENDS它處理的Django級認證,並
  2. settings.REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'],其驗證的REST框架水平

我遇到的問題是我有一箇中間件層檢查用戶是否登錄。

當使用通過會話進行身份驗證的網絡客戶端時,這可以正常工作。但是,從移動設備或運行測試套件(即使用HTTP標頭和令牌進行身份驗證)時,中間件會將用戶檢測爲AnonymousUser,但當我們到達REST Framework層時,會讀取HTTP Authorization標頭,用戶已登錄。

爲什麼這些不是在中間件之前發生的?此外,爲什麼REST Framework的身份驗證方法不依賴於Django身份驗證後端?

+0

很好的問題@BillyBBone。我遇到了同樣的問題。你有沒有想過在中間件中驗證DRF請求的方法? –

回答

6

默認情況下,Django Rest Framework不會在中間件中執行身份驗證,原因與Django默認不在中間件中執行身份驗證的原因相同:中間件適用於所有視圖,並且當您只想驗證對小部分你的意見。另外,有能力爲不同的API端點提供不同的身份驗證方法是非常方便的功能。

Rest Framework的身份驗證方法不依賴於Django身份驗證後端,因爲Django的後端已針對常見情況進行了優化,並且與用戶模型隱性鏈接。 Rest Framework旨在使它容易:

  1. 使用許多不同的身份驗證方法。 (您希望基於HMAC的身份驗證完成!這是使用django身份驗證框架無法實現的)
  2. 在不需要數據庫的情況下提供API數據。 (你有一個redis數據庫,包含內存中的所有數據?以毫秒爲單位,無需等待數據庫用戶模型的往返旅程。)
+1

你知道一種創建DRF請求中間件的方法嗎? –

+0

@SteveWalsh對於任何請求,與中間件相同。如果您需要它專門在DRF視圖上運行,則可以測試當前視圖是否來自DRF基本ApiView的子類。 – Thomas

+0

如何測試當前視圖是否來自DRF基本ApiView的子類? – awidgery

相關問題