flask 装饰器 AssertionError: View function mapping is overwriting an existing endpoint function

1 问题描述

写了一个登陆认证装饰器, 部分试图,只有用户登陆才能访问

def login_wrapper(func):
    def inner(*args, **kwargs):
        """
        判断是否登陆
        若是
            进入视图函数
        否则
            重定向到登陆页面
        """
        if IS_LOGIN['is_login']:
            res = func(*args, **kwargs)
            return res
        return redirect('/login')

    return inner

 

 

启动项目后遇到如下报错:

   AssertionError: View function mapping is overwriting an existing endpoint function: inner

 

2 报错重现

原来如果把函数名写重,就会导致出现该报错

 

 

但是这里视图函数名并没有问题,为什么也出现了这个问题?

 

查资料后得知,是 装饰器 出现了问题!

经过 装饰器 装饰之后的函数,它们的 __name__ 已经从原来的函数名变成 inner,也就是变成了装饰器内部的函数名称

我们可以通过打印函数的 __name__ 看到这一结果:

 

3 解决

1) 给inner._ _name_ _设置唯一值

 

2) 路由中给参数endpoint设置唯一值

 

posted @ 2024-04-04 22:38  tslam  阅读(72)  评论(0编辑  收藏  举报