重载django的HttpRequest的setattr的魔力在哪里?

时间:2015-06-08 21:14:40

标签: python django

[编辑:这结果是一个关于任意Python对象的问题,这是我一般都知道但在这个特殊情况下暂时变得愚蠢而忘了。请参阅this questionthis answer,以及Python Data model参考,其中说明c.x(相当于第一个近似值)等同于c.__dict__['x'],特别是{{1} }等价于c.x = y,因此通常可以向Python对象添加任意属性,除非它被明确地抑制。]

似乎可以在c.__dict__['x'] = y的{​​{3}}类型的对象上设置任意属性(事实上,HttpRequestdone middleware。例如,请考虑以下django.http会话:

ipython

但我无法从source codecurrent 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;首先对它的工作方式感到惊讶。)

0 个答案:

没有答案