не работает сессия во Flask python

Хочу залогиниться под своими email и password. Но в account['id'] получаю ошибку:

TypeError: tuple indices must be integers or slices, not str

Я понимаю, что имеется ввиду, но не понимаю как исправить. Как получать id и email именно того пользователя, который хочет залогиниться? Как это решить?

@app.route('/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        email = request.form['email']
        password = request.form['password']

        cur = mysql.connection.cursor()
        cur.execute('SELECT * FROM users.data WHERE email = %s AND password = %s', (email, password))

        account = cur.fetchall()

        if account:
            session['loggedin'] = True
            session['id'] = account[0]
            session['email'] = account[1]
            return redirect(url_for('profile'))
        else:
            return 'Email/Password incorrect!'

    return render_template('login.html')

@app.route('/profile', methods=['GET','POST'])
def profile():
    if 'loggedin' in session:
        return render_template('profile.html', email=session['email'])
    return redirect(url_for('login'))

Ответы (1 шт):

Автор решения: Viewed

Предположу, что вы понимаете разницу между методами

  • fetchall() – число записей в виде упорядоченного списка
  • fetchmany(size) – число записей не более size
  • fetchone() – первая запись

Тогда здесь предположу ожидание следующего результата

account = cur.fetchone()
# (id, email)

Следовательно вместо обращения по ключу, использовать индекс

session['id'] = account[0]
session['email'] = account[1]
# Вместо 
# session['id'] = account['id']
# session['email'] = account['email']

Обновление

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

Как получать id и email именно того пользователя, который хочет залогиниться?

Вы запрашиваете данные сессии из формы. Но никак не используете их в запросе к базе.

email = request.form['email']
password = request.form['password']
...
cur.execute('SELECT * FROM users.data')

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

cur.execute(f'SELECT * FROM users.data WHERE email = {email} AND password = {password}')

Где {email} и {password} значения от request.form['email'] и request.form['password']

→ Ссылка