#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
, но это не объясняет ваше сообщение об ошибке.