在sqlite表中查找与用户名对应的密码

时间:2019-05-02 10:09:17

标签: python flask sqlite

我正在运行一个使用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')]

需要发生的是,程序将检查表单输入中的“密码”,并将其与与用户名相关的“密码”进行匹配。例如,如果在表单中输入了ValidNameValidTest,则程序会要求它们与“名称”中的记录匹配。

2 个答案:

答案 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']

namesfetchall的返回值,因此是简单列表。要在上面的表达式中使用它,它应该是映射的映射。

您应该这样构造它:

names = {row[1]: {'id': row[0], 'password': row[2], 'mail': row[3]}
         for row in cur.fetchall()}

但是要注意:这会将整个用户数据库加载到内存中。只有在用户很少的情况下才有意义...