为什么Flask中的函数url_for()产生了这个错误?

时间:2016-10-08 05:31:05

标签: python web flask

当我使用flask时,在我的第一个模板(a.html)中写道:

{{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 个答案:

答案 0 :(得分:1)

基础功能期待不同的网址。

在第一种情况下,烧瓶布线装饰器看起来像:

document.write("Hello world <br> How are you?"); 

在第二个中,未指定令牌,因此作为查询参数传递。

@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

如果你打电话给forget_reset:

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

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