Как сделать функцию декоратора Python во Flask с аргументами (для авторизации)

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

from functools import wraps

def logged_in(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if session.get('logged_in') is not None:
            return f(*args, **kwargs)
        else:
            flash('Please log in first.', 'error')
            return redirect(url_for('login'))
    return decorated_function

И я украшаю взгляды так:

@app.route('/secrets', methods=['GET', 'POST'])
@logged_in
def secrets():
    error = None

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

Если пользователь logged_in является владельцем этой конкретной хот-дога, он может редактировать и управлять своими хот-догами. Если он неЯ выгоняю его на неавторизованный экран.

@app.route('//addmustard/',methods=["GET"])
@logged_in
def addmustard(hotdog):
    if not (authorizeowner(hotdog)):
        return redirect(url_for('unauthorized'))
    do_stuff()

authorizeowner() принимает хотдог в качестве входных данных и проверяет, соответствует ли зарегистрированный владелец хотдога имени владельца, указанному в переменной сеанса.

Я попытался создать функцию обертки / декоратора owns_hotdog, похожую на мою, вошедшую в систему, но он пожаловался, чтоне принимать аргументы. Как мне добиться чего-то похожего? Что-то вроде...

def owns_hotdog(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not authorizeowner(hotdog):
            return f(*args, **kwargs)
        else:
            flash('Please log in first.', 'error')
            return redirect(url_for('login'))
    return decorated_function

Из сообщения об ошибке декоратор, похоже, не получает аргумент hotdog, к которому у представлений Flask есть доступ из переменной в маршруте. Я надеюсь на что-то вроде ...

@app.route('//addmustard/',methods=["GET"])
@logged_in
@owns_hotdog(hotdog)
def addmustard(hotdog):
    do_stuff()

Все работает с моей текущей функцией authorizeowner (hotdog), но кажется более понятным, чтобы она была в качестве обертки поверх моего маршрута, а не в качестве первой строки внутри маршрута.

Некоторые другие заметки:

Я знаю, что Flask-Security и Flask-Principal могут управлять авторизацией для меня. К сожалению, Я'Я использую неподдерживаемую базу данных и не могу использовать эти расширения. Так что я'Я вынужден делать аутентификацию без них.Если вы видите какие-либо явные пробелы в выполнении авторизации таким образом, пожалуйста, дайте мне знать!

Ответы на вопрос(1)

Ваш ответ на вопрос