2

以下代码成功生成令牌并将链接发送到用户的收件箱以进行确认。但是当用户点击它时,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')
4

1 回答 1

1

在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解决了我的问题)。

于 2017-08-08T11:50:04.250 回答