#python #json #flask
Вопрос:
Как только я доберусь до функции verify_token, она продолжит выполнение оператора except вместо возврата значения в «id_user», и я не уверен, почему. Я использую эти библиотеки. flask-логин, sqlalchemy, его опасно для jsonwebserializer и wtforms.
Функции
def get_reset_token(user): serial = Serializer(app.config['SECRET_KEY'], expires_in=900) # 15 mins in seconds return serial.dumps({'id_user':user.id}).decode('utf-8') def verify_token(token): serial = Serializer(app.config['SECRET_KEY']) try: user_id = serial.load(token)['id_user'] except: return None return Users.query.get('id_user') def send_mail(user): token = get_reset_token(user) message = Message('Password Reset Request', recipients = [user.email], sender='noreply@gmail.com') message.body= f''' To Reset your password, click the following link: {url_for('reset_token', token = token, _external = True)} If you did not send this email, please ignore this message. ''' mail.send(message)
маршруты
@app.route('/password_reset', methods = ['GET', 'POST']) def password_reset(): form = Password_request() if request.method == "POST": if form.validate_on_submit: user = Users.query.filter_by(email = form.email.data).first() send_mail(user) flash('Check your email. Password change request has been sent') return redirect(url_for('login')) else: flash('Your email was not linked to an account') return render_template('password_reset.html', form = form) @app.route('/password_reset/lt;tokengt;', methods = ['GET', 'POST']) def reset_token(token): user = verify_token(token) if user == None: flash('The token is invalid or expired') return redirect(url_for('password_reset')) form = Password_success() if form.validate_on_submit: hashed_password=generate_password_hash(form.password.data, method = 'sha256') user.password = hashed_password db.session.commit() flash('Your password has been updated!') return redirect(url_for('signup'))
Комментарии:
1. Вы сделали некоторые
token
вreset_token
и вverify_token
была бы полезна.2. Я напечатал токен в send_mail и токен verify_function, и оба они возвращают один и тот же токен.
Ответ №1:
def verify_token(token): serial = Serializer(app.config['SECRET_KEY']) try: user_id = serial.load(token)['id_user'] except: return None return Users.query.get('id_user') # this looks wrong
Разве последняя строка verify_token
не должна быть return Users.query.get(user_id)
? Вы присваиваете значение токена этой переменной , затем игнорируете его и указываете SQLAlchemy найти запись с идентификатором строкового значения 'id_user'
, в чем я сомневаюсь, что вы собираетесь делать.
def verify_token(token): serial = Serializer(app.config['SECRET_KEY']) try: user_id = serial.load(token)['id_user'] except: return None return Users.query.get(user_id) # What happens when you change this?
Комментарии:
1. У меня было то же
user_id = serial.load(token)['user_id']
самое, что и раньше, но это не сработало так же хорошо. Недавно я изменил его, потому что в flask-login использовался идентификатор пользователя, поэтому я подумал, что в словаре могут быть некоторые конфликтующие значения.2. @Генри ваш фрагмент кода-это не то, что я предлагал, возможно, перечитайте его, чтобы убедиться, что мы на одной странице.