首页 > 解决方案 > flask login_required 下一个参数不起作用

问题描述

我遵循了 miguel grinberg 教程,现在我正在应用我在一个辅助项目中学到的东西,但在所有情况下,我都遇到了一些问题,我起初忽略了这些问题,并认为这是我的错误,但经过调查,我找不到为什么这种行为发生了,问题是当我尝试访问网站内的任何 url 时未登录登录屏幕,但之后原始请求的页面未成功加载并且烧瓶通过 BuildError 异常。

下面是我的代码示例

@app.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
    return redirect(url_for('index'))

form = LoginForm()

if form.validate_on_submit():
    user = User.query.filter_by(username= form.username.data).first()
    if user is None or not user.check_password(form.password.data):
        return redirect(url_for('login'))
    login_user(user)
    next_page = request.args.get('next')
    if not next_page or url_parse(next_page).netloc != '':
        return redirect(url_for('index'))

    return redirect(url_for(next_page))

return render_template('login.html', form=form)

如您所见,我正在获取下一个参数并进行一些安全检查,如果它存在,然后重定向到 next_page url,但是会发生构建错误,例如如下所示

BuildError: Could not build url for endpoint u'/user/4556'. Did you mean
'user' instead?

而用户视图功能看起来像这样

@app.route('/user/<username>', methods=['GET'])
@login_required
def user(username):
    ....   

标签: flaskflask-login

解决方案


代替

return redirect(url_for(next_page))

你可能想要

return redirect(next_page)

您的“下一个”参数看起来像“/user/4556”,但您没有名为“/user/4556”的端点,因此您不想将其传递给url_for. 将字符串直接传递给重定向就足够了。


推荐阅读