【发布时间】:2011-08-22 03:45:44
【问题描述】:
在 Django 中:
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
如您所见,_cached_user 是 request 实例的属性,而 LazyUser() 是请求类的属性:
request.__class__.user = LazyUser()
为什么不一样? LazyUser 基本上只是检查_cached_user 是否存在,如果不存在则为用户查询session 后端。在那种情况下,LazyUser 和 _cached_user 不应该都是实例 request 的属性吗?
【问题讨论】:
标签: django django-authentication django-sessions