2009-07-07 62 views
12

首先:這是不是this相同。 ModelBackend沒有request成員。從backend.get_user訪問request.session

我想訪問當前用戶的會話,而不訪問全局請求對象或他/她的會話ID。

爲什麼?我寫了自己的身份驗證後端,擴展爲ModelBackend。在那裏我有函數get_user (self, user_id),它被每個請求調用(這是由Django認證中間件自動完成的)。不幸的是,get_user不能訪問request,但在我的情況下,我想檢查會話中的數據(爲什麼呢?因爲我沒有本地數據庫並從遠程中間件獲取所有數據。是一種舒適的方式來做某種緩存)。

回答

4

RemoteUserBackend(來自django.contrib.auth.backends)使用特殊的中間件RemoteUserMiddleware訪問請求數據。也許你也可以這樣做。

+0

對不起,我知道這是一箇舊的線程,但我正在查看引用的代碼,並且我沒有看到它在訪問我剛剛通過身份驗證的用戶的請求數據。 – ThatAintWorking 2014-06-12 17:48:17

+2

@RonSmith我已經更新了一些鏈接。訣竅是所有事情都是通過`RemoteUserMiddleware.process_request`完成的 - 它通過一個`request`對象(middleware.py#L40)。它檢查是否存在Remote-User HTTP報頭(L50),如果是,則將該數據傳遞給RemoteUserBackend.authenticate(L73)並將結果保存在請求中(L77)。在這種情況下,只有HTTP標頭的值是passeb,但是想法是,如果你需要auth後端的會話信息,你可以搶先從中間件存儲它。 – drdaeman 2014-06-12 19:04:37

+2

你介意用幾行代碼作爲例子更新你的答案嗎?謝謝。 – 2014-12-18 06:57:47

6

您可以使用微小的ThreadLocalMiddleware。它使請求對象到處都可用。

from django_tools.middlewares import ThreadLocal 

request = ThreadLocal.get_current_request() 
# request.session <-- is now available 

不要忘了中間件添加到您的settings.py的MIDDLEWARE_CLASSES元組:

MIDDLEWARE_CLASSES = (
    ... 
    'django_tools.middlewares.ThreadLocal.ThreadLocalMiddleware', 
    ... 
) 
0

您也可以通過一個「請求」參數設置爲authenticate函數調用它的任何時間:

def authenticate(self, request, **kwargs): 
    ....