Django认证中间件的一些内部机制
在django.contrib.auth的中间件里,我看到了一段代码:
class AuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session'), "requires session middleware"
request.__class__.user = LazyUser()
return None
请告诉我,为什么要用这样的方式 request._class_.user = LazyUser()? 而不是直接用 request.user = LazyUser() 呢?
我知道 _class_ 属性的意思,但我觉得直接给实例变量赋值会更好。我哪里理解错了呢?
2 个回答
-1
这将影响到如何创建request
请求。所有这样的请求实例都会自动把它们的user
属性设置为那个特定的LazuUser
,这样就不需要在每次创建request
时都去手动修改这个属性了。
9
LazyUser
是一个描述符类。根据文档,它只能作为类的属性,而不能作为实例的属性:
举个例子,
a.x
的查找过程是这样的:首先查找a.__dict__['x']
,如果找不到,就查找type(a).__dict__['x']
,然后继续查找type(a)
的基类,排除元类。