该auth
中间件添加user
到属性request
就是实例SimpleLazyObject
。SimpleLazyObject
本身是的子类LazyObject
。LazyObject
如实际代码所述:
另一个类的包装器,可用于延迟所包装类的实例化
SimpleLazyObject
只是通过传入的方法(在这种情况下为)设置该类(的_wrapped属性on LazyObject)get_user。这是该方法的代码:
def get_user(request):
if not hasattr(request, '_cached_user'):
request._cached_user = auth.get_user(request)
return request._cached_user
它本身实际上只是一个包装器auth.get_user
,它启用了一种缓存机制。因此,这实际上是最终运行的:
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
因此,这里真正要进行的request.user
就是模棱两可,直到将其实际用于某件事为止。这很重要,因为它允许它根据当前的身份验证状态进行调整。如果你在身份验证之前访问它的属性,它将返回一个实例AnonymousUser
,但如果你先进行身份验证然后访问它,则将返回的实例User
。