request.user返回一个SimpleLazyObject,如何唤醒它?

2024-06-17 12:10:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下方法:

def _attempt(actor):
    if actor.__class__ != User:
        raise TypeError

从视图中调用:

self.object.attempt(self.request.user)

如您所见,尝试方法期望actor是类型django.contrib.auth.models.User,但是对象似乎是类型django.utils.functional.SimpleLazyObject。为什么会这样?更重要的是,如何将LazyObject(显然是用户对象的包装)转换为User对象?

有关Request.user的更多信息,请访问:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.user此文档似乎表明request.user应该是User对象。。。

=Post编辑=

我现在有以下方法:

def _attempt(obj, action, actor, msg): 
    actor.is_authenticated() 
    if isinstance(actor, LazyObject): 
        print type(actor) 

我正在传递一个用户,但是if条件仍然是真的,actor仍然是LazyObject。为什么会这样?


Tags: 对象django方法用户self类型ifrequest
3条回答

这应该做到:

# handle django 1.4 pickling bug
if hasattr(user, '_wrapped') and hasattr(user, '_setup'):
    if user._wrapped.__class__ == object:
        user._setup()
    user = user._wrapped

我不得不写这个,这样我就可以在会话字典中添加一个用户。(SimpleLazyObjects不可拾取!)

user= request.user._wrapped if hasattr(request.user,'_wrapped') else request.user

然后使用user而不是request.user

这与UsAaR33的答案类似,但是一行代码更适合转换对象。

my answer on a similar question

Django lazy加载request.user,因此根据身份验证状态,它可以是UserAnonymousUser。它只会“唤醒”并在访问属性时返回相应的类。不幸的是,__class__不算数,因为这是一个原始类属性。有时您可能需要知道这实际上是一个SimpleLazyObject类型,因此将其代理到UserAnonymousUser上是错误的。

长和短,你不能做这个比较,因为你有它。但是,你到底想在这里实现什么?例如,如果您试图检查它是User还是AnonymousUser,则有request.user.is_authenticated()用于此。

不过,一般来说,你不应该滥用鸭子打字。一个参数应该始终是一个特定的类型或子类型(UserUserSubClass),即使它不具有的值。否则,最终会出现混乱而脆弱的代码。

相关问题 更多 >