Python Flask自定义角色包装器提供;AssertionError:View函数映射正在覆盖现有端点函数:run;

Python Flask自定义角色包装器提供;AssertionError:View函数映射正在覆盖现有端点函数:run;,python,flask,wrapper,rbac,flask-login,Python,Flask,Wrapper,Rbac,Flask Login,我正在尝试创建一个角色包装器,它允许我为不同的用户限制某些页面和内容。我已经实现了一些方法来检查这一点,但是实现这一点的包装器/装饰器失败了,有时甚至没有,我不知道原因是什么 我四处搜索,寻找导致这个问题的决定性原因,但不幸的是,Flask的回溯并没有给出决定性的原因或解决方案,就像我找到的大多数其他搜索一样 我使用Flask Login、Flask Migrate和Flask SQLAlchemy来管理我的web应用程序,我研究了应用RBAC的不同方法,但它们都需要对我的数据库模型进行看似复杂

我正在尝试创建一个角色包装器,它允许我为不同的用户限制某些页面和内容。我已经实现了一些方法来检查这一点,但是实现这一点的包装器/装饰器失败了,有时甚至没有,我不知道原因是什么

我四处搜索,寻找导致这个问题的决定性原因,但不幸的是,Flask的回溯并没有给出决定性的原因或解决方案,就像我找到的大多数其他搜索一样

我使用Flask Login、Flask Migrate和Flask SQLAlchemy来管理我的web应用程序,我研究了应用RBAC的不同方法,但它们都需要对我的数据库模型进行看似复杂的更改,我觉得从长远来看,我的方法会有更高的工作机会

这是我的简化代码(如果需要,我可以提供完整的应用程序)。下面是调试器的完整回溯

多谢各位

routes.py

def require_角色(角色=[“用户]):
def wrap(函数):
def运行(*args,**kwargs):
如果当前用户已通过身份验证:
如果当前\u用户具有\u角色(角色):
返回函数(*args,**kwargs)
返回中止(401)
回程
回程包装
@app.route(“/hidden/history”)
@需要登录
@需要_角色(角色=['Admin'])
def隐藏_历史记录(id):
如果未验证\u id(id):
返回“错误:错误id”
返回渲染模板('hidden\u history.html')
@app.route(“/hidden/help”)
@需要登录
def隐藏_帮助(id):
如果未验证\u id(id):
返回“错误:错误id”
返回渲染模板('hidden\u help.html')
@app.route(“/hidden/”)
@需要登录
@需要_角色(角色=['Hidden'])
def隐藏(id):
如果未验证\u id(id):
返回“错误:错误id”
# ...
返回渲染模板('hidden.html')
回溯(最近一次呼叫最后一次)

回溯(最近一次呼叫最后一次):
文件“A:\Programming\Python\Flask\xevion.dev\wsgi.py”,第1行,在
从应用程序导入应用程序,数据库
文件“A:\Programming\Python\Flask\xevion.dev\app\\uuuuu init\uuuuuu.py”,第18行,在
从应用程序导入路由、模型
文件“A:\Programming\Python\Flask\xevion.dev\app\routes.py”,第143行,在
@需要_角色(角色=['Hidden'])
文件“c:\users\xevion\appdata\local\programs\python\36\lib\site packages\flask\app.py”,第1251行,位于decorator中
添加url规则(规则、端点、f、**选项)
文件“c:\users\xevion\appdata\local\programs\python\36\lib\site packages\flask\app.py”,第67行,在wrapper\u func中
返回f(自,*args,**kwargs)
文件“c:\users\xevion\appdata\local\programs\python\36\lib\site packages\flask\app.py”,第1222行,在add\u url\u规则中
'现有终结点函数:%s'%1!'
AssertionError:视图函数映射正在覆盖现有端点函数:run

Edit:我现在意识到,当有多个对包装器函数的调用时,它不起作用。为什么?

乍一看,它似乎与
require\u角色中的
run
函数发生冲突
decorator():


为了解决过去几个小时困扰我的问题,我研究了
flask\u login
模块的实际工作原理,经过一番调查,我发现他们使用了
functools
中的导入,名为
wrapps

我导入了它,复制了
flask\u login
基本上是如何实现它的,我的应用程序现在正在运行

def require_角色(角色=[“用户]):
def wrap(函数):
@包装(func)
def装饰视图(*args,**kwargs):
如果当前用户已通过身份验证:
如果当前\u用户具有\u角色(角色):
返回函数(*args,**kwargs)
返回中止(401)
返回视图
回程包装


更改
运行
函数的名称不会起任何作用,错误不会改变<代码>断言错误:视图函数映射正在覆盖现有端点函数:wrapped_func
:(感谢分享!我的装饰器中缺少此
wrapps
。你救了我一整晚!
def require_role(roles=["User"]):
    def wrap(func):
        def wrapped_func(*args, **kwargs):
            ...