Я пытаюсь реализовать сброс пароля с помощью ссылки на электронную почту во Flask.Это мой код в views.py:
@app.route("/reset_password/<token>", methods=['GET', 'POST'])
def reset_token(token):
if current_user.is_authenticated:
return redirect(url_for('homepage'))
user = User.verify_reset_token(token)
if user is None:
flash('That is an invalid or expired token', 'warning')
return redirect(url_for('reset_request'))
form = ResetPasswordForm()
if form.validate_on_submit():
hashed_password = generate_password_hash(form.password.data, method='sha256')
User.objects(email=token.email).update_one(set__username=hashed_password)
flash('Your password has been updated! You are now able to log in', 'success')
return redirect(url_for('login'))
return render_template('reset_token.html', title='Reset Password', form=form)
Это мой код в models.py
class User(UserMixin, db.Document):
meta = {'collection': 'users'}
email = db.StringField(max_length=35)
name = db.StringField(max_length=35)
surname = db.StringField(max_length=35)
password = db.StringField()
username = db.StringField()
image_file = db.StringField(nullable=False, default='static/img/default.jpg')
skills = db.ListField(db.StringField())
def get_reset_token(self, expires_sec=1800):
s = Serializer(app.config['SECRET_KEY'], expires_sec)
return s.dumps({'email': self.email}).decode('utf-8')
@staticmethod
def verify_reset_token(token):
s = Serializer(app.config['SECRET_KEY'])
try:
email = s.loads(token)['email']
except:
return None
return User.objects(email='email')
def __repr__(self):
return f"User('{self.email}', '{self.image_file}')"
Это мой код в forms.py
class RequestResetForm(FlaskForm):
email = StringField('Email', validators=[validators.DataRequired()])
submit = SubmitField('Request Password Reset')
def validate_email(self, email):
user = User.objects(email=email.data).first()
if user is None:
raise ValidationError('There is no account with that email. You must register first.')
class ResetPasswordForm(FlaskForm):
password = PasswordField('New Password', validators=[validators.DataRequired()])
confirm_password = PasswordField('Confirm Password', validators=[validators.DataRequired(), validators.EqualTo('password')])
submit = SubmitField('Reset Password')
Когда я пытаюсь вставить новый пароль (после этого на мой электронный адрес была отправлена ссылка с токеном), он не сохраняется, и я могу получить доступ к профилю со старым паролем.Я использую Mongoengine.Может кто-то помочь мне, пожалуйста?Спасибо.