我有以下方法:
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
。为什么会这样?
这应该做到:
我不得不写这个,这样我就可以在会话字典中添加一个用户。(SimpleLazyObjects不可拾取!)
然后使用
user
而不是request.user
。这与UsAaR33的答案类似,但是一行代码更适合转换对象。
见my answer on a similar question。
Django lazy加载
request.user
,因此根据身份验证状态,它可以是User
或AnonymousUser
。它只会“唤醒”并在访问属性时返回相应的类。不幸的是,__class__
不算数,因为这是一个原始类属性。有时您可能需要知道这实际上是一个SimpleLazyObject
类型,因此将其代理到User
或AnonymousUser
上是错误的。长和短,你不能做这个比较,因为你有它。但是,你到底想在这里实现什么?例如,如果您试图检查它是
User
还是AnonymousUser
,则有request.user.is_authenticated()
用于此。不过,一般来说,你不应该滥用鸭子打字。一个参数应该始终是一个特定的类型或子类型(
User
或UserSubClass
),即使它不具有的值。否则,最终会出现混乱而脆弱的代码。相关问题 更多 >
编程相关推荐