我正在使用Python 3.4。我有这样的路线:
@user.route('/manage_users', methods=['GET'])
@login_required
@any_administrator_required
def manage_users():
print('lkjrd')
any_administrator_required
是我的装饰者,如此定义:
def any_administrator_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.data['primary_administrator'] and not current_user.data['secondary_administrator']:
abort(403)
return f(*args, **kwargs)
return decorated_function
我登录的用户类:
class LoggedInUser(UserMixin):
data = {}
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return str(self.data['user'])
我能够进入我的登录或登出页面并登录并正常退出,但是当我在未登录时使用login_required
装饰的路线时,它并非如此使用401重定向或中止。当我在未登录时转到/manage_users
时,它会通过login_required
装饰器并转到它失败的any_administrator_required
,因为匿名用户类没有&#39} ; t具有self.data
属性。我试过移动装饰器,使它按顺序排列:
@user.route('/manage_users', methods=['GET'])
@any_administrator_required
@login_required
def manage_users():
print('lkjrd')
但它仍然有相同的结果。我的unauthorized_callback
:
@login_manager.unauthorized_handler
def unauthorized_callback():
return redirect(url_for('login', next=request.path))
我的登录代码段:
logged_in_user = LoggedInUser()
logged_in_user.data = user_data
login_user(logged_in_user)
session['logged_in'] = True
我的退出路线:
@logout.route('/logout', methods=['GET'])
@login_required
def logout():
logout_user()
session.pop('logged_in', None)
return redirect(url_for('main'))
当然,在未登录时转到/logout
只是重定向到主页,没有401。
用户加载程序:
@login_manager.user_loader
def load_user(user_id):
r = REQUEST_USER_DATA_FROM_API
logged_in_user = LoggedInUser()
logged_in_user.data = r.json()
return logged_in_user
答案 0 :(得分:0)
在跟踪flask_login.py
模块后,login_manager._login_disabled
为True,因为已启用测试。当_login_disabled
为True时,login_required
装饰器不执行任何操作。
login_required
的代码:
@wraps(func)
def decorated_view(*args, **kwargs):
if current_app.login_manager._login_disabled:
return func(*args, **kwargs)
elif not current_user.is_authenticated():
return current_app.login_manager.unauthorized()
return func(*args, **kwargs)