Я работаю над изменением приложения cookiecutter Flask. Я пытаюсь подписаться на https://realpython.com/blog/python/handling-email-confirmation-in-flask/, чтобы добавить авторизацию по электронной почте.
Моя пользовательская модель на скриншоте, а также:
class User(UserMixin, SurrogatePK, Model):
__tablename__ = 'users'
username = Column(db.String(80), nullable=True)
email = Column(db.String(80), nullable=False)
#: The hashed password
password = Column(db.String(128), nullable=True)
created_at = Column(db.DateTime, nullable=False, default=dt.datetime.utcnow)
first_name = Column(db.String(30), nullable=True)
last_name = Column(db.String(30), nullable=True)
active = Column(db.Boolean(), default=False)
admin = Column(db.Boolean(), default=False)
confirmed = db.Column(db.Boolean, default=False)
confirmed_on = db.Column(db.DateTime, nullable=True)
def __init__(self, username=username, email=email, password=None, **kwargs):
db.Model.__init__(self, username=username, email=email, **kwargs)
if password:
self.set_password(password)
else:
self.password = None
def set_password(self, password):
self.password = bcrypt.generate_password_hash(password)
В рамках процесса регистрации я получаю электронное письмо из формы и обрабатываю его, создавая из него токен и создавая User , а затем отправляя электронное письмо с подтверждением на электронную почту, используя:
@blueprint.route("/get_email/", methods=['GET', 'POST'])
def get_email():
form = EmailForm(request.form, csrf_enabled=False)
if form.validate_on_submit():
new_user = User.create(username=None,email=form.email.data)
token = generate_confirmation_token(form.email.data)
confirm_url = url_for('user.confirm_email', token=token, _external=True)
html = render_template('users/activate.html', confirm_url=confirm_url)
subject = "Please confirm your email"
send_email(form.email.data, subject, html)
return redirect(url_for("main.home"))
В этом случае я отправил электронное письмо по адресу:
[email protected]
Письмо содержит ссылку для подтверждения, которая выглядит так:
http://127.0.0.1:5000/users/confirm/ImNsdWVtYXJpbmU1QG1haWxpbmF0b3IuY29tIg.CZ-urA.n5IErF0CPPG6EnIwJeSP6mPmDb4
который содержит встроенный адрес электронной почты «[email protected]» в токене.
Для подтверждения вы нажимаете на эту ссылку, которая активирует следующий маршрут:
@blueprint.route('/confirm/<token>')
def confirm_email(token):
try:
email = confirm_token(token)
except:
flash('The confirmation link is invalid or has expired.', 'danger')
user = User.query.filter_by(email=email).first_or_404()
if user.confirmed:
flash('Account already confirmed. Please login.', 'success')
else:
user.confirmed = True
user.confirmed_on = datetime.datetime.now()
db.session.add(user)
db.session.commit()
flash('You have confirmed your account. Thanks!', 'success')
return redirect(url_for('main.home'))
при отладке код работает нормально до тех пор, пока
db.session.commit()
Затем я получаю ошибку выше. Что я делаю не так?