1
0
mirror of https://github.com/django/django.git synced 2025-07-05 02:09:13 +00:00

magic-removal: Fixed #1488 -- request.user is no longer read-only. Also improved it to only hit the session database table if a user is requested.

git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2590 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2006-03-28 23:47:45 +00:00
parent e7a47635a2
commit 02b3f4489d

View File

@ -1,32 +1,22 @@
class UserWrapper(object): class LazyUser(object):
""" def __init__(self, session):
Proxy to lazily load a user object. self.session = session
""" self._user = None
def __init__(self, login):
self._login = login
self._cached_user = None
def _get_user(self): def __get__(self, request, obj_type=None):
from django.contrib.auth.models import User if self._user is None:
if not self._cached_user: from django.contrib.auth.models import User, AnonymousUser, SESSION_KEY
self._cached_user = User.objects.get(pk=self._login) try:
return self._cached_user user_id = self.session[SESSION_KEY]
self._user = User.objects.get(pk=user_id)
_user = property(_get_user) except (KeyError, User.DoesNotExist):
self._user = AnonymousUser()
def __getattr__(self, name): del self.session # We don't need to keep this around anymore.
if name == '__setstate__': # slight hack to allow object to be unpickled return self._user
return None
return getattr(self._user, name)
class AuthenticationMiddleware: class AuthenticationMiddleware:
def process_request(self, request): def process_request(self, request):
from django.contrib.auth.models import SESSION_KEY from django.contrib.auth.models import SESSION_KEY
assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'." assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
try: request.__class__.user = LazyUser(request.session)
user_id = request.session[SESSION_KEY]
request.user = UserWrapper(user_id)
except KeyError:
from django.contrib.auth.models import AnonymousUser
request.user = AnonymousUser()
return None return None