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

Django中一个视图的多个装饰器:执行顺序

刘子实
2023-03-14
问题内容

我正在尝试由两个装饰器装饰Django视图,一个装饰器用于检查登录,另一个用于检查is_active。

第一个是内置的@login_required,第二个如下:

def active_required(function):
    dec = user_passes_test(lambda u: u.is_active, '/notallowed', '')
    return dec(function)

现在,Python中的装饰器可以由内而外工作,但是以下操作不起作用:

@active_required
@login_required
def foo(request):
    ...

我想首先检查用户是否已登录,如果没有,请重定向到登录页面,如果他或她已登录,则要检查他或她是否处于活动状态,如果不是,则执行重定向到'/notallowed'

发生的情况是,如果login_required失败,则不会将用户重定向到登录页面,而是@active_required会执行该用户,并且由于在这种情况下用户为null,@
active_required装饰器将失败,并将用户重定向到/notallowed

更改顺序似乎可行,

@login_required
@active_required
def foo(request):
    ...

但我怀疑这种方法也有问题。

组合两个装饰器的正确方法是什么,为什么执行顺序与简单的Python装饰器不同?


问题答案:

现在,Python中的装饰器由内而外地工作

好吧,我想这取决于您由内而外的定义。对于您的情况,您要@login_required首先执行,因此它应该是“最外面的”(顶部)装饰器。

如您所述,您的最后一个示例有效,并且确实是实现此目的的正确方法。

编辑

困惑可能是这些特定装饰器的工作方式。

@login_required(@original_view) 返回一个新视图,该视图首先检查您是否已登录,然后调用original_view

所以

    @login_required(
        @active_required(
            @my_view
        )
    )



first checks if you are logged in, then
    first(second) checks if you are active, then
        runs my_view


 类似资料:
  • 问题内容: 输出: 我大致了解装饰器,以及在大多数示例中它如何与装饰器一起使用。 在此示例中,有2个。从输出看,似乎先执行,然后执行。 这是否意味着对于装饰功能,它将首先运行该功能,然后移至其他装饰器的顶部?像先那么,而不是相反。 所以这意味着它与大多数编程语言中的自顶向下方法的规范不同吗?仅用于这种装饰器吗?还是我错了? 问题答案: 装饰器 包装 正在装饰的功能。这样就修饰了装饰器的结果,从而修

  • Python 拥有一件非常有趣的特性,那就是函数装饰器。这个特性允许您使用一些 非常简介的语法编辑 Web 应用。因为 Flask 中的每个视图都是一个函数装饰器, 这些装饰器被用来将附加的功能注入到一个或者多个函数中。 route() 装饰器您可能已经使用过了。但是在一些情况下您需要实现自己的装饰器。例如, 您有一个仅供登陆后的用户访问的视图,如果未登录的用户试图访问,则把用户 转接到登陆界面。

  • rank ▲ ✰ vote url 3 1346 1485 2648 url Python中如何在一个函数中加入多个装饰器? 怎么做才能让一个函数同时用两个装饰器,像下面这样: @makebold @makeitalic def say(): return "Hello" 我希望得到 <b><i>Hello</i></b> 我只是想知道装饰器怎么工作的! 去看看文档,答在下面: def

  • 问题 一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。 解决方案 假设装饰器是通过 @wraps (参考9.2小节)来实现的,那么你可以通过访问 __wrapped__ 属性来访问原始函数: >>> @somedecorator >>> def add(x, y): ... return x + y ... >>> orig_add = add.__wrappe

  • 问题内容: 我想对表单使用django 1.3的基于类的通用视图,但有时必须在一种表单中管理多个表单类。但是,看起来基于FormMixin的现有视图假定了一个表单类。 通用视图是否有可能,我将如何做? 编辑:澄清一下,我有一种形式,但不止一种(基于ModelForm的)类。例如,在django文档的inline_formset示例中,我想展示一个页面,在其中可以以一种形式一次编辑作者和他的书: 问

  • 本文向大家介绍Golang 函数执行时间统计装饰器的一个实现详解,包括了Golang 函数执行时间统计装饰器的一个实现详解的使用技巧和注意事项,需要的朋友参考一下 背景 最近在搭一个新项目的架子,在生产环境中,为了能实时的监控程序的运行状态,少不了逻辑执行时间长度的统计。时间统计这个功能实现的期望有下面几点: 实现细节要剥离:时间统计实现的细节不期望在显式的写在主逻辑中。因为主逻辑中的其他逻辑和时