关于
在1.3中,我理解
AuthenticationMiddleware
,为什么 Django 1.3 在类级别上处理了 user
属性,
而在 1.4 中将其更改为实例属性?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):
request.__class__.user = LazyUser()
return None
而这是从1.4开始的
def get_user(request):
if not hasattr(request, '_cached_user'):
request._cached_user = auth.get_user(request)
return request._cached_user
class AuthenticationMiddleware(object):
def process_request(self, request):
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'."
request.user = SimpleLazyObject(lambda: get_user(request))
# SimpleLazyObject inherits from LazyObject
在1.3中,我理解
process_request
将LazyUser()
分配给类级别的user
属性。这对我来说基本意味着两件事:
HttpRequest
类(request.__class__
)在两个请求之间存储了它的user
属性,因此未来的request
对象可以访问它。- 每当视图函数尝试访问
request.user
时,触发LazyUser
对象的__get__
方法,并返回一个用户对象,该对象要么来自请求的缓存,要么来自授权存储。
SimpleLazyObject
被分配给request
,而不是它的类(因此,它是一个实例属性)。LazyObject
和SimpleLazyObject
不定义(自定义)它们自己的__get__
方法。
get_user
?AuthenticationMiddleware
现在如何在两个请求之间存储request.user
,并覆盖Http的无状态性?