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