关于AuthenticationMiddleware
,为什么 Django 1.3 会user
在类级别处理属性,为什么在 1.4 中将其更改为实例属性?
这是从 1.3
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__
方法并从请求的缓存或身份验证存储中返回一个用户对象。
我说得对吗?
另外,我在 1.4 中注意到了这两个主要变化:
SimpleLazyObject
被分配给request
,而不是它的类(因此,它是一个实例属性)。LazyObject
并且SimpleLazyObject
不要定义(自定义)他们自己的__get__
方法。
这样,什么时候get_user
触发?
现在如何AuthenticationMiddleware
在两个请求之间存储request.user,并覆盖Http的无状态?