2017-08-07 24 views
1

以下のコードは、トークンを正常に生成し、確認のためにユーザーの受信トレイにリンクを送信します。しかし、ユーザーがそれをクリックすると、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') 
+0

トークンは有効ですか?トークンのタイムスタンプはあなたのmax_ageよりも小さいですか? –

+0

@ Dor-Ronご注意ありがとうございます!失敗した試行をしている人は、すべてのプロセスを一度に処理しています。max_ageは86400です。私はトークンの妥当性を調べるために多くの印刷ステートメントを出しました。私はこれを初めて使うので、結論は100%ではありません...しかし、私はトークンにデータがあり、ユーザーの電子メールがtry節の本文にあることに気付きました。そして、私の驚いたことに、except節に入れたprintステートメントは決して走りませんでした。ユーザーのログは、try節が実行された直後に消滅します(ユーザーは404ページにダンプされます)。 – okcapp

+0

すぐに404ページに進むのではなく、例外をキャッチしてログに記録してみてください。 –

答えて

0

Userクラスのための私の__init__方法は、このラインを持っています

self.email = email.lower() 

、ユーザーが電話でプロファイルを作成すると、自分の電子メールアドレスは、多くの場合、大文字で始まります。だから私はちょうど、ユーザーが私が送信された確認リンクをクリックしたときに、トークンで開催された電子メールは、データベース内のメールと一致するよう

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

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

を変更するために必要な

それら。 (要するに、上の図のように.lower()を追加するとdumpsは私の問題を解決しました)。

関連する問題