允许用户在会话期间切换帐户

Allow user to switch accounts during a session

我有一个正在开发的网络应用程序。用户注册并登录。登录需要用户名和密码。会话以用户名开始。

session['username'] = user.username

目前用户每次会话只有一个帐户。我想允许用户在每个会话中拥有多个帐户。示例:Facebook 允许您在同一会话下拥有个人页面和 public 个人页面(或其他类型的页面)。我想要类似的东西。

为此,我要将会话更改为:

session['email'] = user.email

假设用户名在数据库中没有唯一约束,这应该允许我在同一会话中的用户名之间切换。

没有太多的会话经验,我的问题是:这是正确的方法吗?有没有标准或更好的方法来做到这一点?

根据我上面提供的内容,进一步开发了该应用程序。在您提供电子邮件和密码的意义上,登录类似于 FB。注册时有一个默认用户。

def login():
    if request.method == 'POST':
        email = request.form.get('email', '')
        password = request.form.get('password', '')
        dbsession = sessionmaker(bind=get_db())()
        error = None
        login = dbsession.query(Login).filter(Login.email == email).one_or_none()
        login_user, _ = dbsession.query(User, Login).\
            filter(
                User.email == Login.email,
                User.username == email
            ).one_or_none()
        print(login_user)
        if login is None or login_user is None:
            error = 'Username/Password Combination is invalid.'
        else:
            if login.check_password(password) is False:
                error = 'Username/Password Combination is invalid.'
                print(error)

        if error is None:
            session.clear()
            session['email'] = login.email
            session['username'] = login_user.email
            session['userID'] = login_user.userID
            return redirect(url_for('base'))

        flash(error)

    return render_template('auth/login.html')

创建新用户后,使用下面的 select 用户函数在它们之间切换。

@bp.route('/user/select', methods=('GET',))
def select_user():
    session_email = session.get('email', None)
    if session_email is not None:
        db = get_db()
        db_session = sessionmaker(bind=db)()

        results = db_session.query(User, Login).\
        filter(
            User.email == Login.email,
            Login.email == session_email
        ).all()
        users = dict(map(lambda x: (x[0].username, x[0]), results))
        requested_swap = request.args.get('user', None)
        if requested_swap is not None:
            if requested_swap in users:
                session['username'] = users[requested_swap].username
                session['userID'] = users[requested_swap].userID
        db_session.close()
        return render_template('auth/select_user.html', users=users)
    return render_template('auth/select_user.html')