Django 的 request._cached_user 的目的是什么?

What is the purpose of Django's request._cached_user?

Django 的新手,并真正尝试牢牢掌握其内置的身份验证和会话机制。查看当前 (v1.8) 源代码,我看到了:

django/contrib/auth/middleware.py

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' before "
            "'django.contrib.auth.middleware.AuthenticationMiddleware'."
        )
        request.user = SimpleLazyObject(lambda: get_user(request))

当我 grep 通过 Django 代码时,我没有看到任何其他地方引用了 request._cached_user,并且除了 auth 中间件中的 lambda 之外,没有其他地方调用了这个特定的 get_user()。除非我不了解中间件,否则 process_request() 每个请求只调用一次。

我是否遗漏了 Django 将 _cached_user 存储在 request 中,不再引用它的明显原因?

作为一般 Django MVC 模式的一部分,视图通过请求(未登录用户)。

然而,在任何使用 login/authentication.

的 Django 应用程序中,访问经过身份验证的用户模型是一个频繁的操作

框架(尤其是 AuthenticationMiddleware)假定与请求关联的经过身份验证的用户在处理每个 Web 请求期间不会更改。

出于性能原因,get_user 函数保留关联用户的引用,从而避免对关联用户重复进行数据库查询。

只是解读德怀特的回答:

我猜 get_user() 函数在不同的地方被调用,并且在一个请求-响应周期中被多次调用。鉴于 request 是 "global" (技术上不是全局范围)变量被传递,将用户对象设置为请求属性是有意义的。