Колба перед запросом - добавление исключения для определенного маршрута
в моей функции before_request(), я хочу перенаправить пользователя в /login, если они еще не вошли в систему. Есть ли специальная переменная, которая даст мне текущий URL-адрес, который будет работать в соответствии с приведенным ниже примером?
@app.before_request
def before_request():
# the variable current_url does not exist
# but i want something that works like it
if (not 'logged_in' in session) and (current_url != '/login'):
return redirect(url_for('login'))
Мне нужно проверить, что текущий url - '/login', потому что, если я не сервер, он переходит в бесконечный цикл.
спасибо!
Ответы
Ответ 1
Существует несколько свойств объекта запроса, который вы можете проверить, документально подтвержденного здесь, request.path
, вероятно, того, чего вы хотите. Могу ли я предложить request.endpoint
, поэтому вы будете защищены, если вы решите направить свое представление на другой URL-адрес или несколько URL-адресов
@app.before_request
def before_request():
if 'logged_in' not in session and request.endpoint != 'login':
return redirect(url_for('login'))
Ответ 2
Вы можете использовать декоратор. Вот пример того, как проверять ключ api перед специальными запросами
from functools import wraps
def require_api_key(api_method):
@wraps(api_method)
def check_api_key(*args, **kwargs):
apikey = request.headers.get('ApiKey')
if apikey and apikey == SECRET_KEY:
return api_method(*args, **kwargs)
else:
abort(401)
return check_api_key
И вы можете использовать его с помощью:
@require_api_key
Ответ 3
Здесь реализация принятого ответа с flask-login:
@app.before_request
def require_authorization():
from flask import request
from flask.ext.login import current_user
if not (current_user.is_authenticated or request.endpoint == 'login'):
return login_manager.unauthorized()