【问题标题】:User authentication not working in flask and sqlite用户身份验证在烧瓶和 sqlite 中不起作用
【发布时间】:2020-11-01 07:08:54
【问题描述】:

我要做的是获取电子邮件 ID 并与 SQLite 表进行比较。
如果表中存在电子邮件,则我使用电子邮件 ID 和随机生成的密码更新表并邮寄它们。
如果表中不存在电子邮件,那么我使用插入查询将电子邮件以及随机生成的密码输入到表中。
在插入或更新查询被触发后,我使用 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 查询会引发唯一电子邮件 ID 的约束冲突错误。
如果有更好的方法来做到这一点,我很期待

【问题讨论】:

    标签: python python-3.x sqlite flask flask-mail


    【解决方案1】:

    对于 SELECT COUNT 不返回任何内容的第一个错误,在 Sqlite3 中使用 select * 而不是 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") 
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      • 2014-04-09
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      相关资源
      最近更新 更多