Как вы используете Flask -Login и пользовательские Python декораторы для назначения пользовательских разрешений? - PullRequest
0 голосов
/ 05 марта 2020

Я не могу понять, как заставить декоратор Python работать в режиме Flask.

Вот мой декоратор:

from functools import wraps

def admin_only(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("It did something")
        if current_user.is_anonymous:
            flash("Please log in to use this site.", "info")
            return redirect(url_for('login'))
        if not current_user.admin:
            abort(403)
        return func(*args, **kwargs)
    return wrapper


@bp.errorhandler(403)
def forbidden_403(exception):
    return 'Admin access only', 403

А вот мой взгляд:

@bp.route('/add_info', methods=['GET', 'POST'])
@admin_only
def add_info():
    add_info_form = AddInfoForm()
    if add_info_form.validate_on_submit():
        print("Code here")
    else:
        for error in add_info_form.errors:
            flash(error, "info")
    context = {
        'add_info_form': add_info_form,
    }
    return render_template('admin/add_info.html', **context)

Декоратор просто не работает - представление работает, но пропускает любого пользователя. Ни один код, который должен быть реализован до запуска функции представления, не запускается. Я пробовал разные приемы форматирования, но ничего не получалось.

Я использовал код из этого ответа - Python декоратор с Flask:

def decorator(take_a_function):
    def wrapper1(take_a_function):
        def wrapper2(*takes_multiple_arguments):
           # do stuff
           return take_a_function(*takes_multiple_arguments)

        return wrapper2
    return wrapper1

Кажется, ничего не работает. Чего мне не хватает?

Заранее спасибо.

1 Ответ

0 голосов
/ 06 марта 2020

Хорошо, я не уверен, почему это работает, но я скажу так:

Я использую структуру файла чертежа, которая выглядит примерно так:

/app
   /user
      /__init__.py
      /forms.py
      /templates/user
         /user.html
   /lists
      /__init__.py
      /forms.py
      /templates/lists
         /lists.html
   /admin
      /__init__.py
      /forms.py
      /templates/admin
         /add_user.html
         /add_info.html
         /all_lists.html
   __init__.py
   forms.py
   models.py
   /templates
      index.html

У меня было ранее определял функцию декоратора в /admin/__init__.py. Когда я просто переместил его в файл app/__init__.py, функция работает нормально!

Я счастлив, но я также надеюсь, что кто-то может поделиться некоторыми подробностями о том, почему это происходит таким образом. Если нет, я приму мой ответ. Возможно, это как-то связано с порядком Flask запуска функций в файле __init__.py ...

...