2015-06-15 2 views
1

Я пытаюсь настроить декоратор login_required из пакета Flask-Login. Я прочитал исходный код и имитировал синтаксис.Функции обертки в Python 3.4 отсутствует требуемый позиционный аргумент

Mine:

def login_role_required(f, req_roles=['any']): 
@wraps(f) 
def decorated_view(*args, **kwargs): 
    if current_app.login_manager._login_disabled: 
     return f(*args, **kwargs) 
    if not current_user.is_authenticated(): 
     return current_app.login_manager.unauthorized() 

    if req_roles == ['any']: 
     return f(*args, **kwargs) 
    user_roles = current_user.get_roles 

    # Check to make sure all required roles are had by user 
    for r in req_roles: 
     if r not in user_roles: 
      current_app.login_manager.unauthorized() 
    return f(*args, **kwargs) 
return decorated_view 

Источник:

def login_required(func): 
@wraps(func) 
def decorated_view(*args, **kwargs): 
    if current_app.login_manager._login_disabled: 
     return func(*args, **kwargs) 
    elif not current_user.is_authenticated(): 
     return current_app.login_manager.unauthorized() 
    return func(*args, **kwargs) 
return decorated_view 

Пожалуйста, простите плохой отступ от копирования/вставки.

Задача: Когда я использую свою функцию для обертывания, она не может получить первый аргумент, f (функция).

@app.route('/shutdown', methods=['POST']) 
@login_role_required(req_roles=['admin']) 
def shutdown_server(): 
    pass 

TypeError: login_role_required() missing 1 required positional argument: 'f' 

Должно быть что-то маленькое, я делаю не так-ловко. Спасибо за ваше время.

ответ

6

login_role_required должен быть функцией, которая возвращает функцию декоратора, которая, в свою очередь, принимает один аргумент - украшенную функцию и возвращает измененную функцию. Таким образом, это должно выглядеть так:

def login_role_required(req_roles = None): 
    if req_roles is None: 
     req_roles = ['any'] 

    def decorator (f): 
     def decorated_view(*args, **kwargs): 
      # … 
      return f(*args, **kwargs) 
     return decorated_view 

    return decorator 
+0

Благодарим вас за то, что вы так поняли, тыкайте! –

Смежные вопросы