Flask 登录未检测到匿名用户
Flask Login not detecting Anonymous Users
我正在使用 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:
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
失败,因为匿名用户 class 没有' 具有 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
通过 flask_login.py
模块进行跟踪后,login_manager._login_disabled
为真,因为已启用测试。当 _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)
我正在使用 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:
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
失败,因为匿名用户 class 没有' 具有 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
通过 flask_login.py
模块进行跟踪后,login_manager._login_disabled
为真,因为已启用测试。当 _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)