<p>我正在阅读Django的源代码,遇到了一个关于<code>AuthenticationMiddleware</code>的问题。在</p>
<p>如文档所述,认证中间件</p>
<blockquote>
<p>Adds the user attribute (a instance of <code>User</code> model) to every incoming HttpRequest</p>
</blockquote>
<p>但我不明白在<code>AuthenticationMiddleware.process_request()</code>中是怎么做到的。如下面的代码所示,<code>process_request</code>这里只需将<code>LazyUser()</code>分配给<code>request.__class__</code>,这与<code>User</code>模型无关。而且<code>LazyUser.__get__()</code>看起来很奇怪,让我很困惑。在</p>
<pre><code>class LazyUser(object):
def __get__(self, request, obj_type=None):
if not hasattr(request, '_cached_user'):
from django.contrib.auth import get_user
request._cached_user = get_user(request)
return request._cached_user
class AuthenticationMiddleware(object):
def process_request(self, request):
assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
request.__class__.user = LazyUser()
return None
</code></pre>
<p>简单地说,我想知道当<code>AuthenticationMiddleware</code>钩住处理<code>HttpRequest</code>时,幕后究竟发生了什么??在</p>