ошибка объекта ‘sqlite3.Cursor’ без атрибута ‘__getitem__’ в Python Flask

#python #sqlite #flask

#python #sqlite #flask

Вопрос:

Это мой код. Я получаю эту ошибку каждый раз, когда нажимаю войти:

объект ‘sqlite3.Cursor’ не имеет атрибута ‘__getitem__’

Это моя вкладка входа в систему:

 @app.route('/', methods=['GET', 'POST'])
def login():
    error= None
    if request.method == "POST":
        with sql.connect("database.db") as con:
            cur = con.cursor()
            try:
                data = cur.execute("SELECT name FROM users WHERE name= ?",(request.form['username'],) )
                data.fetchone()

                if sha256_crypt.verify(request.form['password'], data[0]):
                    session['logged_in'] == True
                    session['username'] = request.form('username')
                    flash('Successfully logged in')
                    return redirect(url_for(hello_world))
                else:
                    error = "Invalid Password or User. Try again."

            except Exception as e:
                flash(e)
                return render_template('login.html',error=error)
        con.close()
        gc.collect()
    return render_template('login.html', error=error)
  

Что я делаю не так?

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

1. прочитайте документ: docs.python.org/2/library/sqlite3.html#sqlite3.Cursor. извлекать один

Ответ №1:

__getitem__ в данном случае относится к доступу к квадратным скобкам data[0] . Ошибка сообщает вам, что вы не можете использовать подобные курсоры. Замените data[0] значением, возвращенным из data.fetchone() .

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

1. x = data.fetchone(), если sha256_crypt.verify(запрос.форма[‘пароль’], x):

2. Вот так? Теперь я получаю другую ошибку, в которой говорится: хэш должен быть в юникоде или байтах, а не в sqlite3.Cursor

3. Ваш код кажется правильным, но ваша ошибка вызывает удивление. Что, если вы print(x) ? Это должен быть кортеж или None .

4. Я думаю, что моя ошибка в моей инструкции sql… data = cur.execute(«ВЫБЕРИТЕ имя ИЗ пользователей, ГДЕ name= ‘?'» (request.form[‘имя пользователя’],))

5. Вам определенно нужен SELECT хэш пароля, не name , но это не объясняет ваше сообщение об ошибке.