2017-08-07 2 views
1

Der folgende Code generiert erfolgreich ein Token und sendet einen Link zur Bestätigung an den Posteingang des Benutzers. Wenn der Benutzer darauf klickt, erkennt Flask das gerade erstellte Token nicht. Hier ist die Fehlermeldung:E-Mail-Bestätigung in Flask schlägt fehl

„Got Ausnahme von ts.loads: 404 Not Found:. Die angeforderte URL wurde auf dem Server nicht gefunden Wenn Sie die URL manuell eingegeben Bitte überprüfen Sie die Rechtschreibung und versuchen Sie es erneut. "

Unterm Strich ist, dass das, was sollte, ist auszuführen, wenn ich das Bestätigungsverfahren Arbeit richtig machen könnte:

return redirect(url_for('tutorials')) 

Aber, wie Sie zusammen mit der Feststellung der Fehlermeldung Stück kann das aus kommt @app.errorhandler(404), etwas läuft schief. Ich bin wirklich festgefahren. Diese Tests werden durchgeführt, bevor die max_age von 86400 Sekunden erreicht ist. Jede Hilfe würde sehr geschätzt werden !!!

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

Ist das Token gültig? Ist der Zeitstempel des Tokens kleiner als Ihr max_age? –

+0

@ Dor-Ron Danke für den Hinweis! Die Person, die den fehlgeschlagenen Versuch macht, durchläuft den gesamten Prozess auf einmal und max_age ist bei 86400, also sollte ich dort gut sein. Ich habe viele Druckanweisungen gemacht, um die Gültigkeit des Tokens zu untersuchen. Nicht 100% sicher, was zu schließen ist, da ich neu in der Verwendung dieses ... bin, aber ich bemerkte, dass es Daten im Token gibt, und dass die E-Mail-Adresse des Benutzers vollständig im Körper der try-Klausel vorhanden ist. Und zu meiner Überraschung lief die print-Anweisung, die ich in die except-Klausel eingab, nie. Die Protokolle des Benutzers erlöschen gleich nach dem Ausführen der try-Klausel (der Benutzer wird auf meine 404-Seite verschoben). – okcapp

+0

Versuchen Sie, die Ausnahme abzufangen und zu protokollieren, anstatt sofort zur 404-Seite zu wechseln. –

Antwort

0

In models.py, meine __init__ Methode zur User Klasse hat diese Zeile:

self.email = email.lower() 

Wenn Benutzer ein Profil auf einem Telefon zu erstellen, ihre E-Mail-Adresse beginnt oft mit einem Großbuchstaben.

Also ich brauche nur

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

zu

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

, so dass die E-Mail in dem Token mit der E-Mail in der Datenbank abgeglichen gehalten, wenn der Benutzer auf dem Bestätigungslink geklickt Ich habe Sie. (Kurz gesagt, fügen Sie .lower() wie oben in meinem Anruf tun dumps mein Problem gelöst).