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

时间:2015-04-16 15:37:35

标签: django django-authentication django-sessions

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))

当我浏览Django代码时,我没有看到request._cached_user被引用的其他任何地方,除了auth中间件中的lambda之外,其他任何地方都没有调用此get_user()。除非我不了解中间件,否则每个请求只会调用process_request()一次。

我错过了明显的原因,为什么Django会在_cached_user中存储request,再也不会引用它了?

2 个答案:

答案 0 :(得分:3)

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

但是,在任何使用登录/身份验证的Django应用程序中,访问经过身份验证的用户模型都是经常运行的。

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

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

答案 1 :(得分:1)

简单解释德怀特的回答:

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