Принудительное перенаправление страницы при ошибках токена с помощью специального декоратора с использованием flask-jwt-extended - PullRequest
0 голосов
/ 06 октября 2019

Я использую библиотеку Flask JWT-Extended для реализации токенов доступа JWT. Когда токен пользователя истекает, является недействительным или не существует, то по умолчанию происходит то, что Flask возвращает JSON, например:

{"msg": "Missing cookie \"access_token_cookie\""}

Я хочу создать декоратор, который обернет @jwt_required но выполняет внутреннее перенаправление (как на страницу входа в систему) вместо возврата JSON, как указано выше.

Вот примерный декоратор:

def redirect_if_error(view_function):
    @wraps(view_function)
    def wrapper(*args, **kwargs):
        jwt_data = _decode_jwt_from_request(request_type='access')

        # Do custom validation here.
        if 'identity' in jwt_data:
            authorized = True
        else:
            authorized = False

        if not authorized:
            return redirect('login', code=302)

        return view_function(*args, **kwargs)

    return jwt_required(wrapper) 

и примерный маршрут страницы с защитой страницы, на который я бы хотел, чтобы Flask перенаправлял пользователя, если произойдет какая-либо ошибка токена:

@mod.route('/')
@redirect_if_error
def home():
    return render_template("index.html") 

Моя проблема в том, что я не могу понять, как переопределить возврат JSON по умолчанию с помощью перенаправления. Если есть какая-либо ошибка, логика вместо функции обтекания игнорируется, и выводится какое-то сообщение об ошибке.

Есть ли лучший способ переопределить поведение по умолчанию с помощью нового декоратора?

1 Ответ

0 голосов
/ 06 октября 2019

Разобрался, как сделать это с помощью специального декоратора. Просто ловить исключение с помощью попытки - кроме как сработало, например:

def redirect_if_jwt_invalid(view_function):
    @wraps(view_function)
    def wrapper(*args, **kwargs):
        # attempt to grab the jwt from request
        try:
            jwt_data = _decode_jwt_from_request(request_type='access')
        except:
            jwt_data = None
        # if the grab worked and the identity key is in the dict then proceed
        if jwt_data and 'identity' in jwt_data:
            return view_function(*args, **kwargs)
        else:
            return redirect('login', code=302)

    return wrapper 

и маршрут:

from Utilities.Helpers import redirect_if_jwt_invalid

mod = Blueprint('page_routes', __name__)

@mod.route('/')
@redirect_if_jwt_invalid
def home():
    return render_template("index.html") 
...