我正在尝试从sqlite3获取带有flask的“用户名”和“密码”数据(使用python3.4)。数据库模式如下:
create table users (
username string primary key,
password string not null
);
这是我的登录代码:
@app.route('/login', methods=['GET', 'POST'])
def login():
error = None
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db = get_db()
cur = db.execute('select username, password from users')
for row in cur.fetchall():
if username == row[0] and password == row[1]:
session['logged_in'] = True
session['username'] = username
flash('You were logged in')
return redirect(url_for('show_entries'))
else:
print(row[0]=='admin')
print(row[1]=='123')
print(row[1]+1)
error = 'Invalid username or password, '+username+','+password+'.'
return render_template('login.html', error=error)
我使用username =“admin”和password =“123”进行了测试。注意三个打印代码。当我发现第二个打印返回false时,我很惊讶,第三个打印返回“124”。我无法理解为什么“row [1]”变成了Integer而不是String,因为“password”是数据库中的一个字符串。
我是python和flask的新手。我认为这是不合理的,因为我没有做任何从字符串到int的转换。我使用username =“test”和password =“test”再次测试它,效果很好。
答案 0 :(得分:0)
我认为问题是string
在sqlite3中实际上看起来并不是有效的列关联,您应该将这些列声明为TEXT
。来自sqlite3 datatype documentation:
声明的“STRING”类型具有NUMERIC的亲和力,而不是TEXT。
这具有以下含义(也来自相同的文档):
具有NUMERIC亲缘关系的列可能包含使用所有五个存储类的值。将文本数据插入NUMERIC列时,如果此类转换无损且可逆,则文本的存储类将转换为INTEGER或REAL(按优先顺序排列)。
因此,当123
存储在该列中时,它将存储为整数,因为转换是可能的。当test
存储在那里时,它仅作为文本存储,因为无法合理地转换为整数或实数。