gpt4 book ai didi

python - flask 装饰器 : Can't pass a parameter from URL

转载 作者:太空狗 更新时间:2023-10-30 01:54:51 24 4
gpt4 key购买 nike

我对 Flask 很陌生,我正在尝试使用装饰器的强大功能:p我在这里阅读了很多东西并发现了大量关于 python 装饰器的主题,但没有什么真正有用的。

@app.route('groups/<id_group>')
@group_required(id_group)
@login_required
def groups_groupIndex(id_group):
#do some stuff
return render_template('index_group.html')

这是我得到的错误:

@group_required(id_group), NameError: name 'id_group' is not defined

好的,id_group 还没有定义,但我不明白为什么我可以在函数 groups_groupIndex 中使用 URL 中的 id_group 参数,但不能在装饰器中使用!

我尝试移动/切换装饰器,但每次都出现相同的错误。

这是我的装饰器,但它似乎工作正常

def group_required(group_id):
def decorated(func):
@wraps(func)
def inner (*args, **kwargs):
#Core_usergroup : table to match users and groups
groups = Core_usergroup.query.filter_by(user_id = g.user.id).all()
for group in groups:
#if the current user is in the group : return func
if int(group.group_id) == int(group_id) :
return func(*args, **kwargs)
flash(gettext('You have no right on this group'))
return render_template('access_denied.html')
return inner
return decorated

也许我没有看到我应该看到的装饰器...我可以这样使用我的装饰器还是需要我重写一些不同的东西?

最佳答案

您将 group_id 定义为函数参数;这使它成为该函数中的本地名称。

这不会使名称对其他范围可用;装饰器所在的全局 namespace 看不到该名称。

但是,包装器 函数可以。它将在调用时从 @apps.route() 包装器传递该参数:

def group_required(func):
@wraps(func)
def wrapper(group_id, *args, **kwargs):
#Core_usergroup : table to match users and groups
groups = Core_usergroup.query.filter_by(user_id = g.user.id).all()
for group in groups:
#if the current user is in the group : return func
if int(group.group_id) == int(group_id) :
return func(*args, **kwargs)
flash(gettext('You have no right on this group'))
return render_template('access_denied.html')
return wrapper

请注意,此装饰器不会将 group_id 参数传递给装饰函数;使用 return func(group_id, *args, **kwargs) 而不是您仍然需要在 View 函数中访问该值。

关于python - flask 装饰器 : Can't pass a parameter from URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18310496/

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