Flask - 带有两个参数化函数的错误 [英] Flask - Error with two parameterized functions
问题描述
我使用这个方法构建了一个函数包装:
def参数化(dec):
$ b $ def层(* args,** kwargs):
def repl(f):$
def role_required(f,roles):
print(roles)
$ b def deco_function(* args,** kwargs):
print('in dec func') #从未在app.blueprints.keys()中调用
auth_mod_used ='auth'
如果auth_mod_used:
print(g.user.role.lower())
print(g .user.role.lower()in(role.lower for role in roles))
如果g.user是None或g.user.role.lower()不在(role.lower for role in role) :
flash('您无权执行此操作','危险')
#TODO:log t o日志服务
返回重定向(url_for('home.index'))
返回f(* args,** kwargs)
返回f(* args,** kwargs)
return decorated_function
目的是为了保护路线,只允许特定角色打通。我试图这样使用它:
$ $ p $ @ mod_lp.route('/ add',methods = ['POST'])
@role_required(['admin','principal'])
def add():
form = LessonPlanForm()
if form.validate_on_submit():
lp = LessonPlan(form.name.data,form.class_day.data)
db.session.add(lp)
db.session.commit()
返回重定向(url_for('lesson_plan。 index'))
错误:
无法为端点lesson_plan.add建立网址
发现这个问题。参数化函数从不调用传入它的函数。我需要这一行:
@wraps(f)
在这个函数里,像这样:
pre $ def role_required(f,roles):
@wraps(f)
def decorated_function(* args,** kwargs):
#等等
I built a function wrapper using this method:
def parametrized(dec):
def layer(*args, **kwargs):
def repl(f):
return dec(f, *args, **kwargs)
return repl
return layer
@parametrized
def role_required(f, roles):
print(roles)
def decorated_function(*args, **kwargs):
print('in dec func') # never called
auth_mod_used = 'auth' in app.blueprints.keys()
if auth_mod_used:
print(g.user.role.lower())
print(g.user.role.lower() in (role.lower for role in roles))
if g.user is None or g.user.role.lower() not in (role.lower for role in roles):
flash('You are not authorized to preform this action.', 'danger')
# TODO: log to logging service
return redirect(url_for('home.index'))
return f(*args, **kwargs)
return f(*args, **kwargs)
return decorated_function
It's intended purpose is to protect a route by only allowing specific roles to get through. I attempt to use it thusly:
@mod_lp.route('/add', methods=['POST'])
@role_required(['admin', 'principal'])
def add():
form = LessonPlanForm()
if form.validate_on_submit():
lp = LessonPlan(form.name.data, form.class_day.data)
db.session.add(lp)
db.session.commit()
return redirect(url_for('lesson_plan.index'))
error:
Could not build url for endpoint 'lesson_plan.add'
Found this issue. The parameterized function never called the function that was passed into it. I needed this line:
@wraps(f)
in the function, like this:
@parametrized
def role_required(f, roles):
@wraps(f)
def decorated_function(*args, **kwargs):
# and so on
这篇关于Flask - 带有两个参数化函数的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!