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
,再也不会引用它了?
答案 0 :(得分:3)
作为一般Django MVC模式的一部分,视图传递请求(未登录用户)。
但是,在任何使用登录/身份验证的Django应用程序中,访问经过身份验证的用户模型都是经常运行的。
框架(特别是AuthenticationMiddleware)假定在处理每个Web请求期间,与请求关联的经过身份验证的用户不会更改。
出于性能原因,get_user函数保留对关联用户的引用,从而避免对关联用户重复数据库查询。
答案 1 :(得分:1)
简单解释德怀特的回答:
我猜get_user()
函数在不同的地方被调用,并且在单个请求 - 响应循环中被多次调用。鉴于request
是"全球" (在技术上不是全局范围)变量被传递它是有意义的将用户对象设置为请求属性。