2015-06-01 134 views
0

我試圖做一個自定義的驗證類作爲使用Django的REST框架我的Django項目的默認身份驗證類(我在views.py文件中它的定義)。雖然我不確定這是否可行,但能夠做到這一點似乎是合乎邏輯的。自定義身份驗證類爲DEFAULT_AUTHENTICATION_CLASSES?

而且我知道通過在視圖中使用@authentication_classes裝飾這種情況的解決方法。但是一遍又一遍地重複同樣的事情似乎不合邏輯。 official API GUIDE也沒有提到它。如果你們中的任何一個遇到過這樣的情況,並且知道解決方案,我希望能夠被闡明。

REST_FRAMEWORK = { 
    . 
    . 
    DEFAULT_AUTHENTICATION_CLASSES: (
     'appname.views.CustomAuthentication', 
    ), 
    . 
    . 
} 

Could not import 'appname.views.CustomAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ImportError: cannot import name views.

感謝

回答

0

我偶然發現了一個解決的辦法。但我不知道它爲什麼起作用。所以,訣竅是你創建一個authentication.py文件並把你的CustomAuthentication放在那裏。

REST_FRAMEWORK = { 
    . 
    . 
    DEFAULT_AUTHENTICATION_CLASSES: (
     'appname.authentication.CustomAuthentication', 
    ), 
    . 
    . 
} 

但我仍然想知道爲什麼這個工作?如果我想使用包含我的CustomAuthentication類的文件的其他名稱怎麼辦?

0

您可以添加默認的驗證類作爲

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': ('myproj.utils.authentication.CustomAuthentication1', 
'myproj.utils.authentication.CustomAuthentication2',) 
} 

當CustomAuthentication1失敗則嘗試CustomAuthentication2級認證。

給路徑權威性類路徑相對於您的項目。

+0

正如您在問題中所看到的,那就是我所做的。除了我沒有在我的應用程序下創建'utils'包。我想在我的'views.py'本身創建Authentication類。我不明白爲什麼這不起作用。此外,你可以檢查我的答案/解決方法。順便說一句,你的意思是使用'myapp'而不是'myproj'? – Kshitij

+0

我的意思是說從項目根目錄添加完整的路徑。 – prateek

+0

假設裏面有一個名爲'myproj'的項目和一個名爲'myapp'的應用程序。所以,基本上你說的是引用'authentication.py'文件中的'CustomAuthentication'類,比如'myproj.myapp.authentication.CustomAuthentication'?我沒有提到項目名稱是必要的,因爲'myapp'已經在設置文件的INSTALLED_APPS中。 – Kshitij

2

最有可能你打導入循環,所以移動您的驗證類視圖文件之外,並納入認證類應該解決的問題,一個專用的文件。

當您導入rest_framework.views(或者其他的通用視圖,包括視圖集),它會自動導入所有默認的認證課程。因此,如果您要在視圖文件頂部導入視圖(很可能),它會嘗試導入位於之後的認證類,您的導入線路位於之後。由於會有循環導入,因此Python會引發無法導入模塊的異常(在這種情況下爲views),這就是您遇到異常的原因。

因此,只需將您的驗證類移出到它自己的文件中,例如authentication.py,並更改您的DEFAULT_AUTHENTICATION_CLASSES以對其進行調整。

REST_FRAMEWORK = { 
    . 
    . 
    DEFAULT_AUTHENTICATION_CLASSES: (
     'appname.authentication.CustomAuthentication', 
    ), 
    . 
    . 
} 
+0

感謝您編寫答案。你正確地理解了這個問題。我也偶然發現了這個解決方案。但是我無法理解這裏導致循環導入的是什麼?你可以製作一個流程圖/一步一步地描述場景嗎?理解會很有幫助。 – Kshitij