Flask中的电子邮件确认失败

时间:2017-08-07 15:48:39

标签: python postgresql heroku flask flask-mail

以下代码成功生成令牌并将链接发送到用户的收件箱以进行确认。但是当用户点击它时,Flask无法识别它刚刚创建的令牌。以下是错误消息:

  

“来自ts.loads的异常:404 Not Found:请求的URL不是   在服务器上找到。如果您手动输入了URL,请检查   你的拼写,然后再试一次。“

最重要的是,如果我能使确认程序正常工作,这应该是应该执行的:

return redirect(url_for('tutorials'))

但是,正如您可以通过注意@app.errorhandler(404)中出现的错误消息而拼凑在一起,就会出现问题。我真的被卡住了。这些测试在达到86400秒的max_age之前完成。任何帮助将不胜感激!!!

from itsdangerous import URLSafeTimedSerializer

ts = URLSafeTimedSerializer(SECRET_KEY, salt='email-confirm-key')

@app.route('/signup', methods=['GET', 'POST'])
def signup():

#skipping unrelated lines of code

        token = ts.dumps(form.email.data, salt='email-confirm-key')
        subject = 'subject goes here'
        msg = Message(subject=subject, sender='name@email.com', recipients=form.email.data.split())
        link = url_for('confirm_email', token=token, _external=True)
        msg.html = render_template("email_confirmationemail.html", link=link, name=request.form['first_name'])
        with app.app_context():
            mail.send(msg)
        return redirect(url_for('checkyouremail'))


@app.route('/confirmemail/<token>')
def confirm_email(token):
    try:
        email = ts.loads(token, salt='email-confirm-key', max_age=86400)

    #skipping unrelated lines of code

    return redirect(url_for('tutorials'))

@app.errorhandler(404)
def not_found(e):
    print('Got exception from ts.loads: {}'.format(e))
    return render_template('404.html')

1 个答案:

答案 0 :(得分:0)

在models.py中,__init__类的User方法有这一行:

self.email = email.lower()

当用户在手机上创建个人资料时,他们的电子邮件地址通常以大写字母开头。

所以我只需要改变

token = ts.dumps(form.email.data, salt='email-confirm-key')

token = ts.dumps(form.email.data.lower(), salt='email-confirm-key')

当用户点击我发送的确认链接时,令牌中保存的电子邮件与数据库中的电子邮件匹配。 (简而言之,如上所示,在我的通话中添加.lower()确实dumps解决了我的问题。