当详细信息肯定在数据库中时,始终验证电子邮件和散列密码 returns None

Verifying email and hashed password always returns None when details are definitely in DB

我有一个简单的程序来检查电子邮件和散列密码是否在 Postgres 数据库中(它本来是一个 cgi 应用程序,但因为它失败了,我首先将它作为脚本进行测试):

import cgi
import cgitb
import hashlib
import psycopg2
from dbconfig import *
cgitb.enable()
print "Content-Type: text/plain\n\n";

def checkPass():
    email = "person@gmail.com"
    password = "mypassword"
    password = hashlib.sha224(password.encode()).hexdigest()
    result = cursor.execute('SELECT * FROM logins WHERE email=%s AND passhash=%s', (email, password))
    print result


if __name__ == "__main__":
    conn_string = "host=%s dbname=%s user=%s password=%s" % (host, database, dbuser, dbpassword)
    conn = psycopg2.connect(conn_string)
    cursor = conn.cursor()
    checkPass()

这个程序总是returns None 上打印。电子邮件和散列密码肯定在数据库中。我把它们放在那里:

email = "person@gmail.com"
allpass = "mypassword"
password = hashlib.sha224(allpass.encode()).hexdigest()
cursor.execute('INSERT INTO logins (email, passhash) VALUES (%s, %s);', (email, password))
conn.commit()

检查数据库显示有电子邮件和散列密码。那么为什么第一个程序 return 没有在 SELECT 语句上呢?哈希不是以相同的方式存储的吗?任何帮助将不胜感激。

我找出问题所在。事实上,cursor.execute() 实际上并没有 return 任何东西。你必须为此使用 fetchone()。

cursor.execute('SELECT * FROM logins WHERE email=%s AND passhash=%s;', (email, password))
result = cursor.fetchone()
print result

这将打印正确结果的元组。