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" (技术上不是全局范围)变量被传递,将用户对象设置为请求属性是有意义的。
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" (技术上不是全局范围)变量被传递,将用户对象设置为请求属性是有意义的。