我遇到了分配的问题request.user
到一个名为prior_user
,然后基本上对用户进行了身份验证,然后检查是否request.user != prior_user
。我预计它们不会相同prior_user
应包含“AnonymousUser.令我惊讶的是,它们是一样的。
示例代码:
prior_user = request.user # request object, obtained froma view
authenticate_user(request) # some function that authenticates
print prior_user.username != request.user.username # returns False i.e.they are the same!
然后我发现prior_user实际上包含一个django.utils.function.SimpleLazyObject的实例,所以我假设它是某种惰性查找类型的东西,即prior_user的值在实际使用之前不会被查找。查看源代码,我无法确认这一点。
任何有 django 经验的人都可以告诉我发生了什么以及为什么需要它?
这让我有点震惊,因为通常的赋值语句并不像我期望的那样工作,Django 中还有什么像这样的行为呢?我也没有看到这个描述docs https://docs.djangoproject.com/en/dev/ref/request-response/#httprequest-objects.
那么任何对 django 具有超人知识的人都可以提供一些清晰的信息吗?
The auth
中间件添加了一个user
归因于request
这是一个实例SimpleLazyObject
. SimpleLazyObject
,它本身是一个子类LazyObject
. LazyObject
正如实际代码所描述的那样:
另一个类的包装器,可用于延迟包装类的实例化
SimpleLazyObject
只是设置该类(_wrapped
属性上LazyObject
)通过传入的方法,在这种情况下,get_user
。这是该方法的代码:
def get_user(request):
if not hasattr(request, '_cached_user'):
request._cached_user = auth.get_user(request)
return request._cached_user
它本身实际上只是一个包装auth.get_user
,这启用了一种缓存机制。所以这就是最终实际运行的内容:
def get_user(request):
from django.contrib.auth.models import AnonymousUser
try:
user_id = request.session[SESSION_KEY]
backend_path = request.session[BACKEND_SESSION_KEY]
backend = load_backend(backend_path)
user = backend.get_user(user_id) or AnonymousUser()
except KeyError:
user = AnonymousUser()
return user
所以,这里真正发生的事情是request.user
在实际用于某件事之前,它是模棱两可的。这很重要,因为它可以根据情况进行调整current认证状态。如果您访问其上的属性before您进行身份验证,它会返回一个实例AnonymousUser
,但是如果您进行身份验证然后访问它,它会返回一个实例User
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)