如何在用户passes中传递Django请求对象test decorator callable函数

2024-05-17 07:00:42 发布

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

我正在使用Django user_passes_test decorator检查用户权限。

@user_passes_test(lambda u: has_add_permission(u, "project"))
def create_project(request):
......

我调用的回调函数具有添加权限,该权限包含两个参数User和一个字符串。我想把请求对象和它一起传递,有可能吗?还有,谁能告诉我,我们如何能够直接访问decorator中的用户对象呢。


Tags: 对象djangolambdatestprojectadd权限def
4条回答

这是因为else下面的第二个print语句。 在执行时调用递归函数,但不调用 到达底部的打印语句。但在n=1之后,即如果条件被执行,那么它将返回到函数recursive(2-1),并返回向下和返回的sum(也是打印),并将sum的值返回到调用recursive(3-1)的位置,依此类推。这就是它打印每个总和的地方

下面给出了只打印最终和的代码。打印包含在主选项中,仅打印最终答案 我希望这会有所帮助

public class add {

    public static void main(String[] args) {

        int sum = recursiveCall(5);
        System.out.println(sum); // this will print 15
    }

    public static int recursiveCall(int num) {

        int sum = 0;

        if(num == 1) {

            sum = 1;
            //System.out.println(sum); this will print 1
            return sum;
        }
        else {

            sum = recursiveCall(num - 1) + num;
        }
        // System.out.println(sum); //this is the reason for each sum.
        return sum;

    }

}

我画了一个序列图,希望这能解释递归过程

递归有一个追溯过程,在调用递归方法之前,下一个命令将被推入调用堆栈。 因此,我们可以简单地说System.out.println将被推到recursiveCall之前调用堆栈,然后在recursiveCall返回后,主进程将继续使用堆栈上的顶部命令,即System.out.println

The Process of Recursion

当递归堆栈满时,它开始从尾部清空自己。这就是if语句下面的print语句开始执行的原因。注意:递归过程将在调用它的地方返回它的值,所以如果不满足条件,它将返回到该点,但是整个递归过程将继续进行,直到堆栈清空为止。 我说的就是所谓的尾部递归

让我解释一下为什么会发生这种情况

第二个print语句将打印除n=1之外的所有和值。当n=1时,第一个print语句将打印出该值

这样考虑:每个非void方法调用都将返回。如果它不返回,它将继续执行,直到到达return语句

您说第二个print语句应该只打印最后一个sum值。但是您可以看到,该方法只能返回两个位置—在if (num == 1)语句中,或者在该方法的末尾。当n为1时,前一个位置只到达一次,这意味着该方法的其他四次将通过末尾的return语句返回。要在末尾到达return语句,必须执行第二次打印。这意味着第二个print语句必须执行四次

使用调试器一步一步地完成代码。这是最容易理解实际发生的事情

相关问题 更多 >