[编辑:这结果是一个关于任意Python对象的问题,这是我一般都知道但在这个特殊情况下暂时变得愚蠢而忘了。请参阅this question和this answer,以及Python Data model参考,其中说明c.x
(相当于第一个近似值)等同于c.__dict__['x']
,特别是{{1} }等价于c.x = y
,因此通常可以向Python对象添加任意属性,除非它被明确地抑制。]
似乎可以在c.__dict__['x'] = y
的{{3}}类型的对象上设置任意属性(事实上,HttpRequest的done middleware。例如,请考虑以下django.http
会话:
ipython
但我无法从source code(current version)看出这是如何实现的。 In [1]: from django.http import HttpRequest
In [2]: request = HttpRequest()
In [3]: request.asdf_foo = 5
In [4]: request.asdf_foo
Out[4]: 5
In [5]: setattr(request, 'asdgadshasdh', 42)
In [6]: request.asdgadshasdh
Out[6]: 42
类只是继承自HttpRequest
,并且似乎无法覆盖object
anwellhere:
__setattr__
那是怎么回事,它是如何运作的,为什么class HttpRequest(object):
...
没有提出request.asdf = 42
?这似乎没有在任何地方记录。
(我的实际原始问题是,在中间件中设置此类属性(例如AttributeError
)是否安全并且不会被恶意用户伪造,但我想这很好,因为标准身份验证中间件做类似的事情 - 现在我和#39;首先对它的工作方式感到惊讶。)