【发布时间】:2015-06-23 03:29:54
【问题描述】:
刚接触 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 代码 grep 时,我看不到任何其他地方引用了 request._cached_user,并且除了身份验证中间件中的 lambda 之外,没有其他地方调用这个特定的 get_user()。除非我不懂中间件,否则 process_request() 每个请求只会调用一次。
我是否错过了一个明显的原因,为什么 Django 将 _cached_user 存储在 request 中,不再引用它?
【问题讨论】:
-
你能弄明白吗?看不懂下面的答案!太奇怪了,其他任何地方都没有提到
_cached_user。
标签: django django-authentication django-sessions