Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask中的电子邮件确认失败_Python_Postgresql_Heroku_Flask_Flask Mail - Fatal编程技术网

Python Flask中的电子邮件确认失败

Python Flask中的电子邮件确认失败,python,postgresql,heroku,flask,flask-mail,Python,Postgresql,Heroku,Flask,Flask Mail,下面的代码成功地生成了一个令牌,并将链接发送到用户的收件箱进行确认。但是当用户单击它时,Flask无法识别它刚刚创建的令牌。以下是错误消息: “从ts.loads获得异常:未找到404:请求的URL未找到。” 在服务器上找到。如果您手动输入URL,请检查 请检查您的拼写,然后重试。“ 底线是,如果我能使确认程序正常工作,这就是应该执行的: return redirect(url_for('tutorials')) 但是,当你注意到@app.errorhandler(404)发出的错误消息时,你

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

“从ts.loads获得异常:未找到404:请求的URL未找到。” 在服务器上找到。如果您手动输入URL,请检查 请检查您的拼写,然后重试。“

底线是,如果我能使确认程序正常工作,这就是应该执行的:

return redirect(url_for('tutorials'))
但是,当你注意到
@app.errorhandler(404)
发出的错误消息时,你会发现有些地方出了问题。我真的卡住了。这些测试是在达到86400秒的最长时间之前进行的。任何帮助都将不胜感激

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')
从其危险的导入URLSafeTimedSerializer
ts=URLSafeTimedSerializer(密钥,salt='email-confirm-KEY')
@app.route('/signup',methods=['GET','POST'])
def signup():
#跳过不相关的代码行
token=ts.dumps(form.email.data,salt='email-confirm-key')
主题='主题在这里'
msg=消息(主题=主题,发件人=收件人)name@email.com,recipients=form.email.data.split()
link=url(确认电子邮件,令牌=token,外部=True)
msg.html=render_模板(“email_confirmationmail.html”,link=link,name=request.form['first_name'])
使用app.app_context():
邮件发送(msg)
返回重定向(url_for('checkyouremail'))
@app.route(“/confirmemail/”)
def确认电子邮件(令牌):
尝试:
email=ts.loads(令牌,salt='email-confirm-key',最大年龄=86400)
#跳过不相关的代码行
返回重定向(url_for('tutorials'))
@app.errorhandler(404)
未找到def_(e):
print('从ts.loads:{}获得异常。格式(e))
返回render_模板('404.html')

在models.py中,
用户
类的my
\uuuu init\uuuu
方法有以下行:

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

所以我只需要改变一下

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


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

令牌有效吗?代币的时间戳是否小于您的最大年龄?@Dor Ron感谢您的留言!尝试失败的人一次经历了整个过程,而max_年龄在86400,所以我应该在那里表现不错。我做了很多打印声明来探索代币的有效性。由于我不熟悉使用这个,所以不能100%确定要得出什么结论。。。但是我注意到令牌中有数据,并且用户的电子邮件一直存在于try子句的主体中。而且,令我惊讶的是,我放在except子句中的打印语句从未运行过。用户的日志在try子句运行后立即消失(用户被转储到我的404页面)。请尝试捕获异常并将其记录下来,而不是立即转到404页面。@John我想你知道了什么。所以我花了一些时间阅读了一些文档,并用不同的try/except案例重新部署了几次。。。我似乎无法让代码进入except子句。你能更具体地说明我应该尝试什么吗?谢谢<代码>例外情况为e:logging.info('从ts.loads获得异常:%s',e)
token = ts.dumps(form.email.data.lower(), salt='email-confirm-key')