[英]locating a password that corresponds to a username within an sqlite table
我正在使用Flask微框架和sqlite3運行一個網站來存儲用戶登錄。 目前,我無法將用戶從HTML表單輸入的用戶名和密碼與我數據庫中的現有記錄進行匹配。
我正在使用flask-login擴展來幫助我,當我嘗試匹配時,我收到一個TypeError:
list indices必須是整數或切片,而不是str
這是我的python代碼,它將SQLite表轉換為變量:
con = sql.connect("table.db")
cur = con.cursor()
cur.execute('SELECT * FROM users')
names = cur.fetchall()
然后我有這個代碼從HTML表單中獲取密碼,並嘗試將其與鏈接到表中用戶名的密碼匹配
user_name = request.form['username']
if request.form['password'] == names[user_name]['password']:
user = User()
user.id = user_name
flask_login.login_user(user)
這就是'名字'的回報:
[(7, 'ValidName', 'ValidTest', 'User@test.com'), (8, 'User2', 'password2', 'User@test2.com')]
需要做的是程序將檢查表單輸入的“密碼”,並將其與用戶名相關的“密碼”匹配。 例如,如果在表單中輸入了ValidName
和ValidTest
,程序將請求它們,並與“names”中的記錄匹配。
我假設您沒有密碼,這是您應該做的事情。 沒有安全性,這是我的骯臟方法
cur.execute('SELECT * FROM users WHERE name = %s AND password = %s', (request.form['username'], request.form['password']))
user = cur.fetchone()
這可能會有所幫助
這是有罪的: names[user_name]['password']
names
是fetchall
的返回值,因此是一個普通列表。 要在上面的表達式中使用它,它應該是映射的映射。
你應該這樣構造它:
names = {row[1]: {'id': row[0], 'password': row[2], 'mail': row[3]}
for row in cur.fetchall()}
但要注意:這會將完整的用戶數據庫加載到內存中。 只有少數用戶才有意義......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.