【发布时间】:2013-03-02 11:24:40
【问题描述】:
关于AuthenticationMiddleware,为什么Django 1.3 在类级别处理user 属性,
为什么在 1.4 中改为实例属性?
这是从 1.3 开始的
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):
request.__class__.user = LazyUser()
return None
这是从 1.4 开始的
def get_user(request):
if not hasattr(request, '_cached_user'):
request._cached_user = auth.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.user = SimpleLazyObject(lambda: get_user(request))
# SimpleLazyObject inherits from LazyObject
在 1.3 中,我了解到 process_request 将 LazyUser() 分配给类级别的 user 属性,这对我来说基本上意味着两件事:
-
HttpRequest类 (request.__class__) 在两个请求之间存储了其user属性,因此未来的request对象可以访问它。 - 每当视图函数尝试访问
request.user时,都会触发LazyUser对象的__get__方法并从请求的缓存或身份验证存储中返回一个用户对象。
我说的对吗?
另外,我在 1.4 中注意到了这两个主要变化:
-
SimpleLazyObject分配给request,而不是分配给它的类(因此,它是一个实例属性)。 -
LazyObject和SimpleLazyObject不定义(自定义)他们自己的__get__方法。
这样get_user什么时候触发?AuthenticationMiddleware现在如何在两个请求之间存储request.user,并覆盖Http的无状态?
【问题讨论】:
-
Session 中间件是一种让您“覆盖 HTTP 的无状态”的中间件。基本上通过使用会话cookie。在这里看看:github.com/django/django/blob/master/django/contrib/sessions/…
标签: python django authentication django-middleware