微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修复此错误:ValueError: Invalid salt in flask?

如何解决如何修复此错误:ValueError: Invalid salt in flask?

有人可以帮我吗?我收到此错误

ValueError:无效的盐

我正在尝试创建登录页面注册。问题是当我要使用用户名和密码访问 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)",(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',"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)

有什么帮助吗?

解决方法

您可以使用 flask-bcrypt 而不是 bcrypt。 flask-bcrypt 是一个烧瓶扩展,这意味着它针对与烧瓶一起使用进行了优化

现在,您可以通过以下方式安装flask-bcrypt

pip install flask-bcrypt

我建议对您的代码进行这些必要的更改:

1.导入flask-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。相反,将密钥声明为环境变量,然后访问它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。