TypeError: соль не указана в колбе (около sha256) - PullRequest
1 голос
/ 26 апреля 2019

Я следую учебнику по flask из Youtube, чтобы создать свой собственный веб-сайт.Тем не менее, есть ошибка, хотя я следовал каждому шагу, как указано в видео.

Моя операционная система MacOS, но автор видео использует Linux.

Здесьмой соответствующий код:

from passlib.hash import sha256_crypt

class register_form(Form):
    username=StringField('Username',[validators.Length(min=2,max=30)])
    password=PasswordField('Password',[
        validators.Length(min=4,max=20),
        validators.EqualTo('confirm',message='Password do not match')
        ])
    confirm=PasswordField('Confirm Password')
    email=StringField('E-mail',[validators.Length(min=6,max=30)])

@app.route('/register',methods=['GET','POST'])
def register():
    form_reg=register_form(request.form)
    if request.method=='POST' and form_reg.validate():
        username=form_reg.username.data
        email=form_reg.username.data
        password=sha256_crypt().encrypt(str(form_reg.password.data))
        #create cursor
        cur=mysql.connection.cursor()
        cur.execute("INSERT INTO users(username,email,password) VALUES(%s,%s,%s)",(username,email,password))
        #commit to db
        mysql.connection.commit()
        cur.close()
        flash('Register successfully,returning to home page...','success')
        #jump to home if success
        redirect(url_for('/home'))
        return render_template('register.html',user=userinfo)
    return render_template('register.html',form=form_reg,user=userinfo)

И прикрепленный мой скриншот относительно ошибки, надеюсь, это может быть полезно: enter image description here

Любые идеи о том, что я могупытаться?

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 26 апреля 2019

Глядя на документацию passlib's метод encrypt() принимает secret в качестве параметра, и этот секрет должен быть в Unicode или байтах :

classmethod PasswordHash.encrypt(secret, **kwds)

Параметры:

secret (Unicode или байты) - строка, содержащая пароль для кодирования.

Если это isnв юникоде или байтах этот метод будет выдавать ошибка типа , как вы видите на скриншоте:

ошибка типа:

  • , если секрет не является юникодом или байтами.
  • , если аргумент ключевого слова имел неверный тип.
  • , если не было указано обязательное ключевое слово.

Вы может попытаться зашифровать строку пароля в Unicode , прежде чем пытаться вызвать метод encrypt() и посмотреть, разрешит ли это вашу ошибку.Что-то вроде:

password_utf=form_reg.password.data.encode()
password = sha256_crypt().encrypt(password_utf)

В качестве альтернативы, возможно, вы могли бы попробовать вместо этого хэшировать свой пароль к форме:

# generate new salt, hash password

password = sha256_crypt.hash(form_reg.password.data))

Надеюсь, это поможет!

...