Разрешить пользователю переключать учетные записи во время сеанса

#python #session #flask-sqlalchemy

#python #сеанс #flask-sqlalchemy

Вопрос:

У меня есть веб-приложение, которое я разрабатываю. Пользователь регистрируется и входит в систему. Для входа требуется имя пользователя и пароль. Сеанс начинается с имени пользователя.

 session['username'] = user.username
  

В настоящее время у пользователя есть только одна учетная запись за сеанс. Я хочу разрешить пользователю иметь несколько учетных записей за сеанс. Пример: Facebook позволяет вам иметь личную страницу и страницу публичного лица (или страницу другого типа) в рамках одного сеанса. Я хочу что-то подобное этому.

Для этого я собираюсь изменить сеанс на:

 session['email'] = user.email
  

Предполагая, что имя пользователя не имеет уникального ограничения в базе данных, это должно позволить мне переключаться между именами пользователей в одном сеансе.

Не имея большого опыта работы с сеансами, мои вопросы: это правильный способ сделать это? Есть ли стандартный или лучший способ сделать это?

Комментарии:

1. Reddit позволяет переключаться между учетными записями. Я задавался вопросом, как им это удалось. Я обновился, чтобы следить за информацией.

Ответ №1:

Основываясь на том, что я предоставил выше, приложение было доработано. Логин похож на 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')
  

После создания нового пользователя переключение между ними выполняется с помощью функции выбора пользователя, которая приведена ниже.

 @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')