我正在运行一个使用Flask微框架和sqlite3的网站来存储用户登录名。目前,我无法将用户从HTML表单中输入的用户名和密码与数据库中的现有记录进行匹配。
我正在使用flask-login扩展名来帮助我,当我尝试匹配时,我收到TypeError:
列表索引必须是整数或切片,而不是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
,则程序会要求它们与“名称”中的记录匹配。
答案 0 :(得分:0)
我认为您尚未对密码进行哈希处理,这是您应该执行的操作。没有安全感 这是我的肮脏方法
cur.execute('SELECT * FROM users WHERE name = %s AND password = %s', (request.form['username'], request.form['password']))
user = cur.fetchone()
This会有所帮助
答案 1 :(得分:0)
这是有罪的:names[user_name]['password']
names
是fetchall
的返回值,因此是简单列表。要在上面的表达式中使用它,它应该是映射的映射。
您应该这样构造它:
names = {row[1]: {'id': row[0], 'password': row[2], 'mail': row[3]}
for row in cur.fetchall()}
但是要注意:这会将整个用户数据库加载到内存中。只有在用户很少的情况下才有意义...