Как сделать функцию декоратора 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 могут управлять авторизацией для меня. К сожалению, Я'Я использую неподдерживаемую базу данных и не могу использовать эти расширения. Так что я'Я вынужден делать аутентификацию без них.Если вы видите какие-либо явные пробелы в выполнении авторизации таким образом, пожалуйста, дайте мне знать!