Flask登录未检测到匿名用户

时间:2015-10-06 22:49:15

标签: python flask flask-login

我正在使用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

1 个答案:

答案 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)
相关问题