首页 > 解决方案 > 用户身份验证在烧瓶和 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 的约束冲突错误。
我期待着是否有更好的方法来做到这一点

标签: pythonpython-3.xsqliteflaskflask-mail

解决方案


对于 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") 

推荐阅读