4

我需要有一個功能告訴我,如果一個Django會話ID當前被驗證或沒有。我知道這已經內置到django中,我的工作很好。手動驗證目前Django的會話ID認證

但是我有被傳遞會話ID的外部應用程序,而當它傳遞會話ID字符串返回Django的,我需要驗證此會話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」是嘗試之前使用/ except塊,這樣就不會,如果YOUR_SESSION_KEY也不存在這個完全失敗? – mikemaccana 2012-02-08 15:51:00

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") 

PS:如果你沒有使用數據庫會話,aeby會從會話引擎中獲得很好的效果。

+0

注意:這隻適用於數據庫支持的會話存儲。你會考慮使用緩存,文件或基於cookie的,這是行不通的。 – drdaeman 2015-08-08 21:43:21