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

时间:2016-06-02 08:05:45

标签: python django

我在Django中与HttpRequest对象混淆了。我知道 AuthenticationMiddleware 会向user添加request,这是HttpRequest的一个实例。代码是here,但我要展示的内容如下:

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

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

感谢您提供帮助。

1 个答案:

答案 0 :(得分:3)

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'