HttpRequest 实例在 Django 中动态添加属性?

chy*_*ENG 3 python django

我对Django 中的HttpRequest对象感到困惑。我知道AuthenticationMiddleware将添加userrequest它的HttpRequest的一个实例。代码在这里,但我想展示的内容如下:

request.user = SimpleLazyObject(lambda: get_user(request))

我已经阅读了 HttpRequest 对象的代码,但找不到user属性,并且它的代码没有__setattr__方法。所以我很好奇为什么代码在访问不存在的属性时不会引发 AtrributeError 。

感谢您提供帮助。

Jam*_*ick 6

HttpRequest是一个继承自object. 在 Python 中,可以随时在对象上设置属性。

HttpRequest描述一个 HTTP 请求,它在正常状态下不包含任何关于用户的数据。这就是为什么AuthenticationMiddleware添加user到请求中的原因。


__setitem__ 是在对象上设置索引项的方法。

__setattr__是在对象上设置属性的方法,是object.


更新
正如@sayse 所说的那样。

>>> class Test(object):
    pass

>>> test = Test()
>>> test.user #Try to access an unset attribute
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    test.user #Try to access an unset attribute
AttributeError: 'Test' object has no attribute 'user'
>>> test.user = 'user' #Set user attribute
>>> test.user #Try to access user
'user'
Run Code Online (Sandbox Code Playgroud)