Как я могу исправить эту ошибку: Ошибка значения: Недопустимая соль в колбе?

#python #bcrypt

Вопрос:

Кто-нибудь может мне помочь, пожалуйста? Я получаю эту ошибку:

Ошибка значения: Недопустимая соль

Я пытаюсь создать страницу входа и зарегистрироваться. Проблема в том, когда я собираюсь login ввести имя пользователя и пароль. В регистрах все в порядке

 app.py

from os import close
from flask import Flask, render_template, redirect, request, url_for, session, flash
from flask_mysqldb import MySQL, MySQLdb
import bcrypt

app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = ''
app.config['MYSQL_DB'] = 'opensol'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
mysql = MySQL(app)


@app.route("/")
def home():
    return render_template("index.html")


@app.route('/register', methods=["GET", "POST"])
def register():
    if request.method == 'GET':
        return render_template("register.html")
    else:
        iden = request.form['id']
        username = request.form['username']
        email = request.form['email']
        password = request.form['password'].encode('utf-8')
        hash_password = bcrypt.hashpw(password, bcrypt.gensalt())
        cur = mysql.connection.cursor()
        cur.execute("INSERT INTO clientes (cl_id,cl_username,cl_email,cl_password) VALUES (%s,%s,%s,%s)",
                    (iden,username, email, hash_password,))
        mysql.connection.commit()
        session['username'] = username
        session['email'] = email
        session['id'] = iden
        return redirect(url_for("home"))

# login


@app.route('/login', methods=["GET", "POST"])
def login():
    if request.method == "POST":
        username = request.form['username']
        password = request.form['password'].encode('utf-8')

        cur = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
        cur.execute("SELECT * FROM clientes WHERE cl_username=%s", (username,))
        user = cur.fetchone()
        cur.close()

        if user is None:
            flash("No encontrado") 

            return render_template("login.html")
        else:

            if bcrypt.hashpw(password, user["cl_password"].encode('utf-8')) == user["cl_password"].encode('utf-8'):
                session['username'] = user['cl_username']
                session['email'] = user['cl_email']
                session['id'] = user['cl_id']
                return render_template("principal.html")
            else:
                return "Error password and email not match"

    else:
        return render_template(url_for('home'))


@app.route('/logout')
def logout():
    session.clear()
    return render_template("home.html")


if __name__ == '__main__':
    app.secret_key = "012#!ApaAjaBoleh)(*%"
    app.run(debug=True)
 

Какая-нибудь помощь?

Комментарии:

1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не комментарий) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.

Ответ №1:

Вы можете использовать flask-bcrypt вместо использования bcrypt. flask-bcrypt-это расширение колбы, что означает, что оно оптимизировано для использования вместе с колбой.

Теперь вы можете установить flask-bcrypt с помощью:

 pip install flask-bcrypt
 

Я предлагаю внести эти необходимые изменения в ваши коды:

1. Импорт колбы-bcrypt

 from os import close
from flask import Flask, render_template, redirect, request, url_for, session, flash
from flask_mysqldb import MySQL, MySQLdb

# import bcrypt  <--- no need of this

from flask_bcrypt import Bcrypt    # <--- importing flask_bcrypt
 

2. Инициализация с помощью приложения

 app = Flask(__name__)
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = ''
app.config['MYSQL_DB'] = 'opensol'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'
mysql = MySQL(app)
bcrypt = Bcrypt(app) # <---- add this line
 

3. Внесите эти изменения в def register():

 password = request.form['password'].encode('utf-8')       # <--- remove .encode('utf-8')
hash_password = bcrypt.hashpw(password, bcrypt.gensalt()) # < --- remove this line

hash_password = bcrypt.generate_password_hash(password).decode('utf-8') # <-- add this line
 

4. Внесите эти изменения в def login() :

 password = request.form['password'].encode('utf-8') # <-- again, no need of .encode('utf'-8)

if bcrypt.hashpw(password, user["cl_password"].encode('utf-8')) == user["cl_password"].encode('utf-8'): # < --- remove this line

if bcrypt.check_password_hash(user['cl_password'],password):  # < --- add this line
 

Поскольку очевидно, что flask-bcrypt довольно прямолинеен, когда дело доходит до реализации.
После вышеуказанных изменений ваше приложение будет плавно выполнять функцию регистрации и входа в систему.

Небольшой совет (не по теме): Никогда не кодируйте свой app.secret_key . Вместо этого объявите секретный ключ в качестве переменной среды, а затем получите к нему доступ.

Комментарии:

1. Если вы хотите узнать больше о flask-bcrypt, ознакомьтесь с официальной документацией