0
我正在從「django.contrib.auth」中抽取靈感並從中取回驗證模塊。你能解釋一下「django.contrib.auth」對我的作用嗎?
他們在做什麼,爲什麼?
def get_user(request):
from django.contrib.auth.models import AnonymousUser
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()
except KeyError:
user = AnonymousUser()
return user
class LazyUser(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_user'):
from django.contrib.auth import get_user
request._cached_user = get_user(request)
return request._cached_user
class AuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session'), "The Django authentication ..."
request.__class__.user = LazyUser()
return None
- 是它試圖阻止命中爲每個請求的用戶實例上的數據庫?
- 如果用戶記錄被更改,它會過時嗎?
- 他們爲什麼不簡單地在會話中保存用戶實例或密鑰?
- 爲什麼分配給
request.__class__.user
而不僅僅是request.user
?
我會添加身份驗證,登錄和註銷例程,但不希望讓您的代碼轉儲過多。我認爲我現在明白了(最後一個問題可能是關鍵),但只是強迫自己提出(某種程度上)明智的問題:-)
爲什麼只把鍵放在會話中而不是整個用戶對象? – 2011-05-06 03:38:04
因爲在會話中放置整個對象並不簡單,加上(雖然這很少發生),但用戶可以使用整個類改變它,導致奇怪的錯誤。 – 2011-05-06 03:41:08
我認爲這也是因爲會話相關的安全問題。 – solartic 2011-05-06 04:17:31