以下のコードは、トークンを正常に生成し、確認のためにユーザーの受信トレイにリンクを送信します。しかし、ユーザーがそれをクリックすると、Flaskは今作成したばかりのトークンを認識していません。ここでは、エラーメッセージは次のとおりです。Flaskでの電子メールの確認に失敗しました
「ts.loadsからもらった例外:404が見つかりません:要求されたURLがサーバー上に見つから ませんでした手動でURLを入力した場合 あなたのスペルをチェックして、再度お試しください。 "
一番下の行は、これは私がきちんと確認手続の仕事を作ることができる場合に実行すべきかということである:あなたが出ているエラーメッセージに注目することによってつなぎ合わせることができますよう、
return redirect(url_for('tutorials'))
しかし、 @app.errorhandler(404)
、何かが間違っています。私は本当に立ち往生している。これらのテストはmax_ageが86400秒に達する前に行われています。どんな助けでも大歓迎です!!! models.pyで
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='[email protected]', 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')
トークンは有効ですか?トークンのタイムスタンプはあなたのmax_ageよりも小さいですか? –
@ Dor-Ronご注意ありがとうございます!失敗した試行をしている人は、すべてのプロセスを一度に処理しています。max_ageは86400です。私はトークンの妥当性を調べるために多くの印刷ステートメントを出しました。私はこれを初めて使うので、結論は100%ではありません...しかし、私はトークンにデータがあり、ユーザーの電子メールがtry節の本文にあることに気付きました。そして、私の驚いたことに、except節に入れたprintステートメントは決して走りませんでした。ユーザーのログは、try節が実行された直後に消滅します(ユーザーは404ページにダンプされます)。 – okcapp
すぐに404ページに進むのではなく、例外をキャッチしてログに記録してみてください。 –