Flask - 带有两个参数化函数的错误 [英] Flask - Error with two parameterized functions

查看:133
本文介绍了Flask - 带有两个参数化函数的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用这个方法构建了一个函数包装:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆