2009-07-07 4 views
12

우선 : 이 아닌this과 같습니다. ModelBackend에는 request 회원이 없습니다.backend.get_user에서 액세스 요청 세션.

전역 요청 개체 또는 세션 ID에 대한 액세스 권한없이 현재 사용자의 세션에 액세스하려고합니다.

왜? 내 자신의 인증 백엔드를 작성하여 ModelBackend까지 확장했습니다. 그 안에는 모든 요청에 ​​대해 호출되는 get_user (self, user_id) 함수가 있습니다 (이것은 장고 인증 미들웨어에 의해 자동으로 수행됩니다). 불행히도 get_userrequest에 액세스 할 수 없지만 그럼에도 불구하고 내 경우에는 세션의 데이터를 확인하고 싶습니다 (왜 다시? 로컬 데이터베이스가 없기 때문에 원격 미들웨어에서 모든 데이터를 가져옵니다.) 어떤 종류의 캐싱을 수행하는 편안한 방법).

답변

4

RemoteUserBackend (django.contrib.auth.backends)은 특수 미들웨어 RemoteUserMiddleware을 사용하여 요청 데이터에 액세스합니다. 어쩌면 너도 그렇게 할 수있을거야.

+0

죄송합니다. 이것은 오래된 스레드이지만 참조 된 코드를보고 있으며 방금 인증 한 사용자의 요청 데이터에 액세스하는 위치가 표시되지 않습니다. – ThatAintWorking

+2

@RonSmith 링크를 약간 업데이트했습니다. 그 트릭은 모든 것이'RemoteUserMiddleware.process_request'에 의해 수행된다는 것입니다 - 그것은'request' 객체를 전달받습니다 (middleware.py # L40). '원격 사용자'HTTP 헤더 (L50)의 유무를 확인한 후, 'RemoteUserBackend.authenticate' (L73)에 전달하여 결과를'요청'에 저장합니다 (L77). 이 경우 HTTP 헤더의 값만 passeb이지만, auth 백엔드에서 세션 정보가 필요하다면 미들웨어에서 세션 정보를 미리 숨길 수 있습니다. – drdaeman

+2

몇 줄의 코드로 답을 업데이트 하시겠습니까? 감사. –

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

불행히도 그것은 GPL V3 ... –

0

당신은 또한 authenticate 기능에 당신이 전화를 언제든지은 '요청'매개 변수를 전달할 수 있습니다 :

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

질문에 대한 get_user 함수, 아니 인증 (..) – chaim

+0

나는 여전히 내가 인증하는 동안 그것을 필요로 유용한 답변을 발견. – Jayen

관련 문제