@Autumnus

Как правильно описать свой обработчик @login_required?

Приветствую!
Воюю с авторизацией на Flask. У меня есть функция:
def loginrequired(f):
def wrapper (*args, **kwargs):
# бла-бла-бла
return wrapper
которая работает как мне нужно, определяя token в заголовке запроса и работая с ним.
Я хочу, дабы эта функция вызывалась перед большинством обработчиков маршрутов, делаю так:

@loginrequired
@app.route('/main', methods=['POST'])

@loginrequired
@app.route('/objects', methods=['POST'])

@loginrequired
@app.route('/projects', methods=['POST'])

В этом случае функция отрабатывает по одному разу с каждым маршрутом при запуске проекта и всё. Если я переношу вызов таким образом:
@app.route('/main', methods=['POST'])
@loginrequired

@app.route('/objects', methods=['POST'])
@loginrequired

@app.route('/projects', methods=['POST'])
@loginrequired
то получаю ошибку AssertionError: View function mapping is overwriting an existing endpoint function: wrapper.

Собственно два вопроса:
1. Как правильно сделать, чтобы при обращении по какому-либо маршруту вызывалась моя loginrequired() и по результатам проверки обрабатывался или нет маршрут?
2. Как из loginrequired() передать в обработчик маршрута какие-либо данные (объект или значение)?
  • Вопрос задан
  • 57 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Возможно, фласк нервничает, потому что у тебя получается несколько функций с именем warpper. Хотя это было бы странно. Попробуй так:
import functools

def loginrequired(f):
    @functools.wraps(f)  # замаскирует wrapper() под f()
    def wrapper (*args, **kwargs):
        pass# бла-бла-бла
        return f(*args, **kwargs)
    return wrapper


А дальше - смотри пример по работе с куками.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы