gpt4 book ai didi

python - request.user返回一个SimpleLazyObject,我怎么 "wake"呢?

转载 作者:IT老高 更新时间:2023-10-28 20:26:23 29 4
gpt4 key购买 nike

我有以下方法:

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

从 View 中调用:

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

如您所见,_attempt 方法要求 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 对象...

======后期编辑=====

我现在有以下方法:

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

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

最佳答案

my answer on a similar question .

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

长短,你根本无法像你那样做这个比较。但是,您真正想在这里实现什么?例如,如果您要检查它是 User 还是 AnonymousUser,则可以使用 request.user.is_authenticated()

但作为一般规则,您不应该滥用鸭式打字。参数应该始终是一个特定的类型或子类型(UserUserSubClass),即使它不是必须。否则,你最终会得到令人困惑和脆弱的代码。

关于python - request.user返回一个SimpleLazyObject,我怎么 "wake"呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314905/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com