flask-security ajax 注销导致会话错误

Posted

技术标签:

【中文标题】flask-security ajax 注销导致会话错误【英文标题】:flask-security ajax logout causes session errors 【发布时间】:2014-01-25 20:11:47 【问题描述】:

当我发布到烧瓶端点时:

@app.route('/api/v1/logout', methods=['POST','GET'])
def logout():
    logout_user()
     return jsonify(status=200, message='User has been successfully logged out.')

我下次尝试登录时遇到错误

InvalidRequestError: Object '<User at 0x7f09b4831c90>' is already attached to session '1' (this is '4')

我想知道如何退出并安全地使用 ajax。

Edit-angularjs 登录控制器:

LoginController: function ($scope, $http, authService, $location) 
    $scope.submit = function() 
      console.log('in logincontroller')
      $http.defaults.headers.post['X-CSRFToken'] = csrf_token;
      $http.defaults.headers.common['Content-Type'] = 'application/json'
      //debugger;
      $http.post(
    '/login',
      JSON.stringify( email: $scope.email, password: $scope.password )
      ).success(
    function(data) 
      if (data.meta)
        var status_code = data.meta.code;
      
      else
        var status_code = data.status;
      
      if (status_code == 200)        
        $.cookie('email', $scope.email,  expires: 7 );
        $.cookie('auth_token', data.authentication_token,  expires: 7 );
        $http.defaults.headers.common['Authentication-Token'] = data.authentication_token;
        authService.loginConfirmed();
        $location.path("/dashboard");
      
      else
     //form stuff
      
    
    ).error(
    function(data) 
      alert('LoginController submit error');
      $scope.errorMsg = data.reason;
      //debugger;
    
      );
    ;
  

【问题讨论】:

你能显示你的登录代码吗...? 【参考方案1】:

我猜你必须在最后重定向才能退出现有会话

@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

【讨论】:

这并没有解决问题。 这是一个烧瓶-sqlalchemy 会话。 最后甚至没有重定向? 最后甚至没有重定向。【参考方案2】:

你做错了。

由于您没有提供登录方法,我从错误日志中猜测您在会话中存储了用户模型。这是完全错误的。

我的建议是您将用户的 ID 存储在会话中。例如

def login_user(user):
    session['user_id'] = user.id

如果需要知道当前用户:

def get_current_user():
    return User.get(session['user_id'])

提出正确的问题,以便人们可以帮助您。

【讨论】:

我想我应该提到我正在使用标签中的flask-security。 Flask-security 会自动执行。

以上是关于flask-security ajax 注销导致会话错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Flask-Security 作为 REST API 的一部分

注销反应应用程序会导致主屏幕出现空指针

如何使用 Flask-Security 注册视图?

快速单击链接会导致注销(会话锁定?)

通过 Flask-JWT REST API 使用 Flask-Security 角色

每当进行 AJAX POST 时,Laravel 4 应用程序都会将用户注销