我在Django中与HttpRequest对象混淆了。我知道 AuthenticationMiddleware 会向user
添加request
,这是HttpRequest的一个实例。代码是here,但我要展示的内容如下:
request.user = SimpleLazyObject(lambda: get_user(request))
我已经阅读了HttpRequest对象的代码,找不到user
属性,其代码没有__setattr__
方法。因此,我很好奇为什么代码在访问不存在的属性时不会引发AtrributeError。
感谢您提供帮助。
答案 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'