Требуется логин по умолчанию вместо добавления декоратора везде
Я использую Flask-HTTPAuth для обработки аутентификации в моем приложении. У меня много просмотров, и я не хочу добавлять login_required
каждому из них. Как я могу сделать логин обязательным по умолчанию?
from flask.ext.httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()
@auth.verify_password
def verify_password(username, password):
return username == '111' and password == '222'
@app.route('/')
@app.route('/home/')
@auth.login_required
def index():
return 'Hello'
@app.route('/route2/')
def route2():
return 'route2'
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
1 ответ
Решение
Вы можете добавить before_request
функция, требующая логин по умолчанию, и создание простого login_exempt
Декоратор для нескольких маршрутов, которые не требуют этого.
Обязательно освободите статические файлы, иначе они не будут загружаться для неаутентифицированных пользователей.
Колба-HTTPAuth-х login_required
нет способа отделить логику запроса от декоратора представления, вам нужно пройти небольшой танец, чтобы требовать авторизацию без запуска представления.
def login_exempt(f):
f.login_exempt = True
return f
# a dummy callable to execute the login_required logic
login_required_dummy_view = auth.login_required(lambda: None)
@app.before_request
def default_login_required():
# exclude 404 errors and static routes
# uses split to handle blueprint static routes as well
if not request.endpoint or request.endpoint.rsplit('.', 1)[-1] == 'static':
return
view = current_app.view_functions[request.endpoint]
if getattr(view, 'login_exempt', False):
return
return login_required_dummy_view()
# for example, the login page shouldn't require login
@app.route('/login', methods=['GET', 'POST'])
@login_exempt
def login():
pass