首页 > 解决方案 > Flask Login 登录后返回 302 状态码(不重定向到主页)

问题描述

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

"POST /login HTTP/1.1" 302 -

后跟 200 状态码:

"GET /login HTTP/1.1" 200 -

这段代码前段时间运行良好,我查看了整个互联网(包括 StackOverflow)试图找到解决这个问题的方法,但没有找到解决方案。是的,使用烧瓶时有关于 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')

标签: pythonflaskflask-login

解决方案


您的代码可以简化一点。例如,您有两次: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)

推荐阅读