python - 用户身份验证在烧瓶和 sqlite 中不起作用
问题描述
我想要做的是获取电子邮件 ID 并与 SQLite 表进行比较。
如果表中存在电子邮件,那么我使用 emailid 和随机生成的密码更新表并将它们邮寄。
如果表中不存在电子邮件,那么我使用插入查询将电子邮件以及随机生成的密码输入到表中。
在插入或更新查询被触发后,我使用 Flask-mail 将生成的密码邮寄给他们但是我无法执行它
def sqliteconfig():
try:
conn = sqlite3.connect('auth.db',check_same_thread=False)
cur = conn.cursor()
conn.execute('CREATE TABLE IF NOT EXISTS auth (AID INTEGER PRIMARY KEY AUTOINCREMENT, emailid TEXT UNIQUE, otp TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP)')
cur.close()
except Exception as e:
print(e)
return 'DatabaseDown'
# return 'DatabaseDown'
return conn
@bp.route('/')
def index_redirect():
return redirect(url_for('devcon.login'))
@bp.route('/login',methods=['GET','POST'])
def login():
conn = sqliteconfig()
cur = conn.cursor()
if request.method == 'POST':
emailid = request.form['emailid']
if emailid != "":
s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
passlen = 8
password = "".join(random.sample(s,passlen ))
conn.execute('select count(*) from auth where emailid=(?)',[emailid])
rows = cur.fetchall();
if len(rows) == 0:
conn.execute('insert into auth(email,otp) values(?,?)',[emailid,password])
conn.commit()
elif len(rows)==1:
conn.execute('update auth SET otp=(?) where emailid=(?)',[emailid,password])
conn.commit()
return str(rows)
return render_template("login/login.html")
我正面临的特殊问题是 SELECT COUNT 查询不返回任何内容,并且 INSERT 查询会引发唯一 emailid 的约束冲突错误。
我期待着是否有更好的方法来做到这一点
解决方案
对于 SELECT COUNT 不返回任何内容的第一个错误,在 Sqlite3select *
中使用而不是select count(*)
. 因此,您的代码应该是:
rows = conn.execute('SELECT * FROM auth WHERE emailid = ?',(emailid,)).fetchall()
对于第二个插入错误,您可能已经将等效的 emailid 值存储到auth
. 这就是您会违反唯一电子邮件 ID 的约束的唯一原因。
另一个(潜在的)错误是您将 otp 设置为 emailid 并将密码设置为 emailid,而应该颠倒顺序:
conn.execute('update auth SET otp=(?) where emailid=(?)',[emailid,password])
相反,请执行以下操作:
conn.execute('UPDATE auth SET otp = ? WHERE emailid = ?',(password, emailid))
最终代码:
def sqliteconfig():
try:
conn = sqlite3.connect('auth.db',check_same_thread=False)
cur = conn.cursor()
conn.execute('CREATE TABLE IF NOT EXISTS auth (AID INTEGER PRIMARY KEY AUTOINCREMENT, emailid TEXT UNIQUE, otp TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP)')
cur.close()
except Exception as e:
print(e)
return 'DatabaseDown'
# return 'DatabaseDown'
return conn
@bp.route('/')
def index_redirect():
return redirect(url_for('devcon.login'))
@bp.route('/login',methods=['GET','POST'])
def login():
conn = sqliteconfig()
cur = conn.cursor()
if request.method == 'POST':
emailid = request.form['emailid']
if emailid != "":
s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"
passlen = 8
password = "".join(random.sample(s,passlen ))
rows = conn.execute('SELECT * FROM auth WHERE emailid = ?',(emailid,)).fetchall()
if len(rows) == 0:
conn.execute('INSERT into auth (email, otp) VALUES (?, ?)',(emailid, password))
conn.commit()
elif len(rows)==1:
conn.execute('UPDATE auth SET otp = ? WHERE emailid = ?',(emailid, password))
conn.commit()
return str(rows)
return render_template("login/login.html")