4

장고 세션 ID가 현재 인증되었는지 여부를 알려주는 함수가 있어야합니다. 나는 이것이 장고에 이미 내장되어 있다는 것을 알고 있으며 나는 그 일을 잘하고있다.수동으로 장고 인증 세션 ID가 현재 인증되었습니다

하지만 세션 ID가 전달 된 외부 응용 프로그램을 가지고 있으며 세션 ID 문자열을 장고로 전달할 때이 세션 ID가 유효하고 현재 인증되어 있는지 확인해야합니다.

django 1.2에 포함 된 내장 함수 중 일부를 다시 사용하려면 어떻게해야합니까?

감사

답변

6

당신은 (테스트하지,하지만 당신에게 가능한 방법을 보여줍니다) 이런 식으로 작업을 수행 할 수 있습니다

from django.utils.importlib import import_module 
from django.conf import settings 
from django.contrib.auth import get_user 
from django.contrib.auth.models import AnonymousUser 
from django.contrib.auth import SESSION_KEY, BACKEND_SESSION_KEY, load_backend 

engine = import_module(settings.SESSION_ENGINE) 
session = engine.SessionStore(YOUR_SESSION_KEY) 

try: 
    user_id = session[SESSION_KEY] 
    backend_path = session[BACKEND_SESSION_KEY] 
    backend = load_backend(backend_path) 
    user = backend.get_user(user_id) or AnonymousUser() 
except KeyError: 
    user = AnonymousUser() 

if user.is_authenticated(): 
    print "User" 
else: 
    print "Guest" 
+0

'YOUR_SESSION_KEY'는 try/except 블록 앞에 사용되므로 YOUR_SESSION_KEY가 없으면 완전히 실패하지 않습니까? – mikemaccana

5

다음은 사용자가 로그인 소스 django.contrib.auth.__init__.login에서 선이다.

request.session[SESSION_KEY] = user.id 

로그 아웃하면 세션이 완전히 플러시되므로 해당 키가 인증 된 사용자입니다.

from django.contrib.auth import SESSION_KEY 
from django.contrib.sessions.models import Session 
try: 
    session = Session.objects.get(session_key=my_key) 
    session.get_decoded()[SESSION_KEY] 
    return (True, "Authenticated") 
except (Session.DoesNotExist, KeyError): 
    return (False, "Not authenticated") 

추신 : 당신이 db 세션을 사용하지 않는 경우 세션 엔진에서 가져 오기위한 좋은 방법입니다.

+0

주의 : 이것은 데이터베이스 기반 세션 저장소에서만 작동합니다. 캐시, 파일 또는 쿠키 기반 쿠키를 사용하는 것이 좋을까요?이 방법은 효과가 없습니다. – drdaeman