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)