2016-10-08 4 views
0

Wenn ich Kolben verwenden, in meiner ersten Vorlage (a.html) schrieb ich:Warum verursacht die Funktion url_for() in Flask diesen Fehler?

{{url_for('auth.confirm', token=token, _external=True)}} 

Es gab die richtige Stelle: /auth/confirm/<token>

Aber in einem anderen: {{url_for('auth.forget', token=token, _external=True)}}

Es gab mir eine Seite wie folgt: /auth/forget?token=<token>

Was macht den Unterschied?

Codes hier:

@auth.route('/forget', methods=['GET', 'POST']) 
def forget(): 
form=ForgetPasswordForm() 
if form.validate_on_submit(): 
    user=User.query.filter_by(email=form.email.data).first() 
    if user: 
     token=user.generate_forget_token() 
     send_email(user.email, 'Reset your password', 'auth/email/forget', token=token) 
     return redirect(url_for('main.index')) 
    flash("Email is not exist") 
return render_template('auth/forget.html',form=form) 

@auth.route('/forget/<token>', methods=['GET', 'POST']) 
def forget_reset(token): 
try: 
    email=User.confirm_forget(token) 
except: 
    return render_template('404.html') 
form=PasswordOnlyForm() 
if form.validate_on_submit(): 
    user=User.query.filter_by(email=email).first() 
    user.password=form.password.data 
    db.session.add(user) 
    db.session.commit() 
    flash('Succeed, now login!') 
    return redirect('auth/login') 
return render_template('auth/PasswordOnly.html',form=form) 

Antwort

1

Die zugrunde liegenden Funktionen erwarten verschiedene URLs.

Im ersten Fall wird der Kolben Routing-Dekorateur wie folgt aussieht:

@app.route('/auth/confirm/<token>') 
def confirm(token): 

In dem zweiten wird das Token nicht angegeben ist, und daher als Abfrage-Parameter übergeben.

@app.route('/auth/forget/') 
def forget(): 

Sie müssen auch aufpassen, welche Funktion Sie anrufen. In Ihrem obigen Beispiel haben Sie zwei Funktionen: forget und forget_reset, die zwei verschiedene Verhaltensweisen haben.

@app.route('/auth/forget/') 
def forget(): 
    pass 

@auth.route('/forget/<token>', methods=['GET', 'POST']) 
def forget_reset(token): 
    pass 

Jetzt nennen Sie sie etwas anders. Wenn Sie rufen vergessen:

<a href="{{url_for('forget', token='hello')}}">Calling Forget</a> 

http://127.0.0.1:5000/forget?token=hello 

Und wenn Sie forget_reset nennen:

<a href="{{url_for('forget_reset', token='hello')}}">Calling Forget Reset</a> 

http://127.0.0.1:5000/forget/hello 
+0

Ich habe in der Tat schrieb '' , aber es funktioniert nicht? –

+0

Danke! Ich habe Namen für diese beiden Endpunkte verwechselt. –

Verwandte Themen