2016-10-08 2 views
0

Когда я использую флягу, в моем первом шаблоне (a.html) Я писал:Почему функция url_for() в Flask вызвала эту ошибку?

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

Он дал правильный сайт: /auth/confirm/<token>

Но в другом: {{url_for('auth.forget', token=token, _external=True)}}

Он дал мне сайт, подобный этому: /auth/forget?token=<token>

Что делает разницу?

Коды здесь:

@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) 

ответ

1

Основополагающие функции ожидают разные адреса.

В первом случае, декоратор колбу маршрутизации выглядит следующим образом:

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

Во-вторых, маркер не указан, и, следовательно, передается в качестве параметра запроса.

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

Вам также необходимо быть осторожным, какую функцию вы вызываете. В приведенном выше примере у вас есть две функции: forget и forget_reset, которые имеют два разных поведения.

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

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

Теперь вы называете их несколько иначе. Если вы звоните забыть:

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

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

И если вы звоните forget_reset:

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

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

Я, действительно написал '' , но он не работает? –

+0

Спасибо! Я ошибаюсь в именах этих двух конечных точек. –

Смежные вопросы