Декоратор Flask для установки категории конечной точки

#python #flask

#python #flask

Вопрос:

Я новичок в Flask и пытаюсь использовать декоратор для установки номера категории (от 1 до 5) для различных конечных точек. Набор значений должен быть доступен для функции ведения журнала, которую я определил и украсил с помощью @bp.after_request проекта.after_request

Я хочу, чтобы мои конечные точки выглядели так:

 @category(3)
@bp.route("/user")
def get_list_of_users():
    pass
 

Моей первоначальной мыслью было использовать глобальный контекст flask (g). Чтобы установить значение g.category из декоратора, а затем прочитать его обратно из функции ведения журнала.

Я закодировал декоратор следующим образом:

 def category(cat):
    def decorator(f):
        g.category = cat
        return f

    return decorator
 

Но я получаю эту ошибку:

 Exception has occurred: RuntimeError
Working outside of application context.
 

Я даже не уверен, является ли это хорошим / стандартным подходом к тому, что я пытаюсь сделать. Любая помощь или предложения будут очень признательны.

Ответ №1:

Вы могли бы использовать одно более глубокое определение:

 def category(cat):
    "This function wraps original handler and takes category number into context"
    def decorator(f):
        "This function gets called during definition with original handler as f"
        def _f(*args,**kwargs):
            "This function gets called as your route handler would (by Flask)"
            g.category = cat
            return f(*args,**kwargs) # it calls the original function, passing args

        return _f

    return decorator
 

Комментарии:

1. Ты победил меня.. Я только что разобрался с этим, но мое решение использовало @wraps. Я предпочитаю ваш. Спасибо!