Аутентификация пользователя не работает в flask и sqlite - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь получить идентификатор электронной почты и сравнить его с таблицей SQLite. Если в таблице есть адрес электронной почты, я обновляю таблицу, добавляя в нее адрес электронной почты и случайно сгенерированный пароль, и отправляю их по почте. Если адрес электронной почты отсутствует в таблице, я использую запрос на вставку, чтобы ввести адрес электронной почты, а также случайно сгенерированный пароль в таблицу. После того, как запрос вставки или обновления запущен, я отправляю им сгенерированный пароль, используя 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 вызывает ошибку нарушения ограничения уникального адреса электронной почты. Я с нетерпением жду, если есть лучший способ сделать это

1 Ответ

0 голосов
/ 12 июля 2020

Для первой ошибки, когда SELECT COUNT ничего не возвращает, в Sqlite3 используется select * вместо select count(*). Следовательно, ваш код должен быть:

rows = conn.execute('SELECT * FROM auth WHERE emailid = ?',(emailid,)).fetchall()

Для второй ошибки вставки у вас уже может быть эквивалентное значение emailid, сохраненное в auth. Это единственная причина, по которой у вас может быть нарушение ограничения уникального идентификатора электронной почты.

Другая (потенциальная) ошибка заключается в том, что вы устанавливаете 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") 
...