我正在阅读Django的源代码,并遇到了关于AuthenticationMiddleware
的问题。
正如文档所述,AuthenticationMiddleware
将用户属性(一个
User
模型实例)添加到每个传入的HttpRequest中
但是我无法理解在AuthenticationMiddleware.process_request()
中如何实现这一点。如下面的代码所示,process_request
只是将LazyUser()
分配给request.__class__
,与User
模型无关。而LazyUser.__get__()
似乎非常奇怪,让我感到很困惑。
class LazyUser(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_user'):
from django.contrib.auth import get_user
request._cached_user = 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'."
request.__class__.user = LazyUser()
return None
简单来说,当
AuthenticationMiddleware
在处理 HttpRequest
时发生了什么?在幕后发生了什么事情?
request.user = LazyUser()
和request.__class__.user = LazyUser()
有什么区别?我认为前者也可以,不是吗? - qweruioprequest.user.username
访问 LazyUser 时,为什么会将request
作为第二个参数传递给__get__
?根据文档,应该是user
才对:“而实例则是访问属性的实例”。 - qweruiopuser
,但LazyUser不知道)。 - AKX