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