Django认证中间件的一些内部机制

4 投票
2 回答
738 浏览
提问于 2025-04-15 11:10

在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) 的基类,排除元类。

撰写回答