gpt4 book ai didi

python - Flask 自定义角色包装器给出 "AssertionError: View function mapping is overwriting an existing endpoint function: run"

转载 作者:行者123 更新时间:2023-12-04 01:42:25 24 4
gpt4 key购买 nike

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

我四处寻找导致此问题的确切原因,但不幸的是,Flask 的回溯并没有像我提出的大多数其他搜索那样给出确凿的理由或解决方案。

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

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

谢谢你。
routes.py

def require_role(roles=["User"]):
def wrap(func):
def run(*args, **kwargs):
if current_user.is_authenticated:
if current_user.has_roles(roles):
return func(*args, **kwargs)
return abort(401)
return run
return wrap

@app.route('/hidden<id>/history')
@login_required
@require_role(roles=['Admin'])
def hidden_history(id):
if not validate_id(id):
return '<span style="color: red;">error:</span> bad id'
return render_template('hidden_history.html')

@app.route('/hidden<id>/help')
@login_required
def hidden_help(id):
if not validate_id(id):
return '<span style="color: red;">error:</span> bad id'
return render_template('hidden_help.html')

@app.route('/hidden<id>/')
@login_required
@require_role(roles=['Hidden'])
def hidden(id):
if not validate_id(id):
return '<span style="color: red;">error:</span> bad id'
# ...
return render_template('hidden.html')
Traceback (most recent call last)
Traceback (most recent call last):
File "A:\Programming\Python\Flask\xevion.dev\wsgi.py", line 1, in <module>
from app import app, db
File "A:\Programming\Python\Flask\xevion.dev\app\__init__.py", line 18, in <module>
from app import routes, models
File "A:\Programming\Python\Flask\xevion.dev\app\routes.py", line 143, in <module>
@require_role(roles=['Hidden'])
File "c:\users\xevion\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 1251, in decorator
self.add_url_rule(rule, endpoint, f, **options)
File "c:\users\xevion\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 67, in wrapper_func
return f(self, *args, **kwargs)
File "c:\users\xevion\appdata\local\programs\python\python36\lib\site-packages\flask\app.py", line 1222, in add_url_rule
'existing endpoint function: %s' % endpoint)
AssertionError: View function mapping is overwriting an existing endpoint function: run

编辑:我现在意识到,当对包装函数有多个调用时,它不起作用。怎么会?

最佳答案

因此,为了解决过去几个小时一直困扰我的问题,我研究了 flask_login模块确实有效,经过一番调查,我发现他们使用了 functools 的导入。调用wraps .

我导入了,复制了flask_login基本上实现了它,我的应用程序现在正在运行。

def require_role(roles=["User"]):
def wrap(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if current_user.is_authenticated:
if current_user.has_roles(roles):
return func(*args, **kwargs)
return abort(401)
return decorated_view
return wrap

flask_login/utils.py#L264

关于python - Flask 自定义角色包装器给出 "AssertionError: View function mapping is overwriting an existing endpoint function: run",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com