2017-10-13 124 views
0

我建立this方法的功能包裝:瓶 - 錯誤有兩個參數功能,

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 

它的預期目的是通過只允許特定的角色來打通,以保護路由。我試圖正是如此使用它:

@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')) 

錯誤:

Could not build url for endpoint 'lesson_plan.add'

回答

0

發現這個問題。參數化函數從未調用傳入它的函數。我需要這一行:

@wraps(f) 
在功能

,就像這樣:

@parametrized 
def role_required(f, roles): 
    @wraps(f) 
    def decorated_function(*args, **kwargs): 
    # and so on