Estrapolerò solo la parte di codice che ha interessato il mio progetto, dove un impiegato della società poteva risettare la sua password.
Per prima cosa ho inserito in una classe le funzioni necessarie
get_reset_token per la generazione del token da inviare alla emai. Nel mio caso per comodità ho inserito nella criptazione anche lo user_id dell'utente che fa richiesta. Mi servirà nella modifica effettiva. Come si vede dalla dichiarazione della funzione, la durata di validità è un parametro che si può settare a piacimento
verify_reset_token per la verifica del token stesso quando viene cliccato il link
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
class User(db.Model, UserMixin):
def get_reset_token(self, expire_sec=1800):
s = Serializer(current_app.config['SECRET_KEY'], expire_sec)
return s.dumps({'user_id' : self.id}).decode('utf-8')
@staticmethod
def verify_reset_token(token):
s = Serializer(current_app.config['SECRET_KEY'])
try:
user_id = s.loads(token)['user_id']
except:
return None
return User.query.get(user_id)
adesso passo alle regole di routing
users.route("/reset_password", methods=['GET', 'POST']) che genera il token e lo spedisce via email
@users.route("/reset_password/", methods=['GET', 'POST']) verifica e criptazione del token per poi procedere al recupero delle informazioni necessarie
per concludere una semplice funzione di invio email usando la classe Message
Maybe you might be interested

come aumentare un contatore in pyhon in un template jinja
il codice seguente è stato scritto e testato nella versione 3.9 e utilizzando il namespace
from myProject import mail
from flask_mail import Message
users.route("/reset_password", methods=['GET', 'POST'])
def reset_request():
if current_user.is_authenticated:
return redirect(url_for('main.homepage'))
form = RequestResetForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
send_reset_email(user)
flash('email spedita con le credenziali', 'info')
return redirect(url_for('users.login'))
return render_template("reset_request.html", title = 'Richiesta reset password', form=form)
@users.route("/reset_password/", methods=['GET', 'POST'])
def reset_token(token):
if current_user.is_authenticated:
return redirect(url_for('main.homepage'))
user = User.verify_reset_token(token)
if user is None:
flash('invalid token', 'warning')
return redirect(url_for('users.reset_request'))
form = ResetPasswordForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
user.password = hashed_password
db.session.commit()
flash("Password modificata", 'success')
return redirect(url_for('users.login'))
return render_template("reset_token.html", title = 'Richiesta reset password', form=form)