@sergey19940808

Flask, как решить проблему с подтверждением регистрации?

Хочу сделать подтверждение регистрации через почту. Приложение пишу на языке Python c помощью фреймворка Flask.
Модель пользователей:

class User(db.Model):
    confirmed = db.Column(db.Boolean)


Здесь поле confirmed отвечает за подтверждение о регистрации.
Также есть три функции для:
# генерации зашифрованного токена
def generate_confirmation_token(email):
    serializer = URLSafeTimedSerializer(SECRET_KEY)
    return serializer.dumps(email, salt=SECURITY_PASSWORD_SALT)

# возвращение токена
def confirm_token(token, expiration=3600):
    serializer = URLSafeTimedSerializer(SECRET_KEY)
    try:
        email = serializer.loads(
            token,
            salt=SECURITY_PASSWORD_SALT,
            max_age=expiration
        )
    except:
        return False
    return email


# функции отправка письма
def send_email(to, subject, template):
    msg = Message(
        subject,
        recipients=[to],
        html=template,
        sender=FLASK_MAIL_SENDER
    )
    mail.send(msg)


Также есть вьюшки:

# вьюшка регистрации
@app.route('/register', methods=['GET', 'POST'])
def register():
    title = 'Регистрация'
    form = RegisterForm()
    if form.validate_on_submit():
        user_add = User(form.nickname.data,
                        form.email.data, form.password.data, confirmed=False)
        db.session.add(user_add)
        db.session.commit()
        subject = 'Подтвердите свой email'
        token = generate_confirmation_token(user.email)
        confirm_url = url_for('user.confirm_email', token=token, external=True)
        html = render_template('email/confirm', confirm_url=confirm_url)
        send_email(user.email, subject, html)
        login_user(user_add)
        flash(u'Письмо с подтверждением отправлено по электронной почте', 'success')
        return redirect(url_for('user', nickname=g.user.nickname))
    return render_template('user/register.html', title=title, form=form)


# вьюшка подтверждения регистрации
@app.route('/confirm/<token>')
def confirm_email(token):
    global email
    try:
        email = confirm_token(token)
    except:
        flash('Ссылка на проверку email неверная или устарела.', 'danger')
        abort(404)
    user = User.query.filter_by(email=email).first_or_404()
    if user.confirmed:
        flash('Учётная запись уже подтверждена. Пожалуйста введите логин.', 'success')
    else:
        user.confirmed = True
        db.session.add(user)
        db.session.commit()
    return redirect(url_for('index'))


В итоге новый пользователь регистрируется, и debugger возвращает ошибку:
AttributeError: 'function' object has no attribute 'email'


Как мне от неё избавиться? В чём моя ошибка?
  • Вопрос задан
  • 869 просмотров
Пригласить эксперта
Ответы на вопрос 1
1) Глобальные переменные - это плохо, это может сильно запутать, когда кода станет больше. ООП - наше всё.
2) Обобщённые эксепшны - это плохо, опечатка/баг в функции confirm_token всегда будет приводить к тому же результату, что и штатный False на выходе. Функции confirm_token это тоже касается - опечатка в сериалайзере и у вас всегда False.
3) Внимательно читайте трейсбеки, пожалуйста. Узнайте, что это за функция, от которой вы ищете атрибут email.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы