Flask 登录后返回 302 状态码(不重定向到主页)

Flask Login Returning a 302 Status Code After Login (Not Redirecting to Home Page)

当尝试使用 Flask-Login 并输入我的登录信息时,我不断收到如下所示的 302 状态代码

"POST /login HTTP/1.1" 302 -

后跟 200 状态码:

"GET /login HTTP/1.1" 200 -

这段代码前段时间运行良好,我在互联网上(包括 Whosebug)进行了搜索,试图找到解决这个问题的方法,但没有找到解决方法。是的,有关于使用 flask 时出现 302 状态码的帖子,但它们对我没有帮助。我正在使用的代码如下。

@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():
        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):
            flash('Invalid username or password')
            return redirect(url_for('login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            next_page = url_for('index')
        return redirect(next_page)
    return render_template('login.html', title='Sign In', form=form)

这就是我的索引路线:

@app.route('/index')
@app.route('/')
def index():
    return render_template('index.html')

您的代码可以稍微简化一下。例如你有两次:if form.validate_on_submit():

这是您的代码的重构版本。请注意,如果登录失败,则不需要 return redirect(url_for('login')),因为最后有 render_template,这将是 运行,并且在页面最初加载时(GET 请求)也是如此。由于您已经在登录例程中,因此重定向实际上没有意义。您只需要调整执行流程即可。

@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):
            flash('Invalid username or password')
        else:
            login_user(user, remember=form.remember_me.data)

            next_page = request.args.get('next')
            if not next_page or url_parse(next_page).netloc != '':
                next_page = url_for('index')
            return redirect(next_page)
    
    return render_template('login.html', title='Sign In', form=form)