当前位置: 首页 > 面试题库 >

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

祁柏
2023-03-14
问题内容

我有以下方法:

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

从视图中调用它:

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

如您所见,_attempt方法期望actor为type django.contrib.auth.models.User,但是该对象似乎为type
django.utils.functional.SimpleLazyObject。为什么会这样呢?更重要的是,如何将LazyObject(显然是User对象的一种包装器)转换为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条件仍然为true,actor仍然是LazyObject。为什么会这样呢?


问题答案:

看到我对类似问题的回答。

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

总而言之,您根本无法进行这种比较。但是,您 真正
要在这里实现什么?如果你想检查它是否是一个User或者AnonymousUser,有request.user.is_authenticated()针对,例如。

作为一般规则,您不应滥用鸭子类型。参数必须始终是特殊的类型或子类型(UserUserSubClass),即使不必 一定
如此。否则,您将得到混乱而脆弱的代码。



 类似资料:
  • 本文向大家介绍HTML5如何唤醒APP?相关面试题,主要包含被问及HTML5如何唤醒APP?时的应答技巧和注意事项,需要的朋友参考一下 有以下几种方式 URL Scheme:最常见 Intent: // :Android Universal Link : iOS, 通过传统的 HTTP 链接即可打开 APP 唤醒途径 iframe的src a标签的src window.location 参考资料:

  • 问题内容: 我正在用C++编写程序。我注意到,它获得了许多线程,它们的目的是定期执行某项操作,其中有3或4个线程。我决定通过编写一个调度程序服务来重构,以便使用这些线程的其他地方可以预订该服务,这应该将我随时运行的额外事件线程的数量减少到一个。 我还没有使用此代码的代码。在开始编写之前,我想知道是否有可能,并获得有关我的设计的一些反馈。我要完成的任务的简要说明是这样的: 添加事件 呼叫者提供事件和

  • 假设10个进程使用sem_wait(). 等待一个信号量,第11个进程调用该信号量的sem_post。 10个进程中哪一个将进入临界块? 像随机吗?所有进程将被唤醒并努力实现锁。 ,CPU将为其中一个进程提供锁,其余的进程将返回等待状态

  • 下面我们来看看睡眠和醒来的基本模型。假设有两个系统调用作为睡眠和唤醒。呼叫睡眠的过程将被阻止,而调用的过程将被唤醒。 有一个叫做生产者消费者问题的流行例子,它是模拟睡眠和唤醒机制的最流行的问题。 睡眠和觉醒的概念非常简单。如果关键部分不是空的,那么该过程将进入休眠状态。它将被临界区内正在执行的其他进程唤醒,以便进程可以进入临界区。 在生产者消费者问题中,让我们说有两个过程,一个过程写某事,而另一个

  • 休眠与唤醒 [HW,ACPI] acpi_sleep={s3_bios,s3_mode,s3_beep,s4_nohwsig,old_ordering,nonvs,sci_force_enable} ACPI休眠选项。 (1)s3_bios和s3_mode与显卡有关。计算机从S3状态(挂起到内存)恢复时,硬件需要被正确的初始化。这对大多数硬件都不是问题,但因为显 卡是由BIOS初始化的,内核无法获

  • Future 一次polled 就能完成的,并不常见。而多数情况下,Future 需要确保一旦准备好前进,就再次进行轮询(poll) 。而这是通过Waker类型,辅助完成的。 每次 Future poll 时,都会将其作为“任务(task)”的一部分。任务是已提交给 executor 的顶级 Future 。 Waker提供一个wake()方法,它可以用来告诉 executor,应该唤醒的相关任务