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