使用flask.redirect时出现Flask 302错误代码

4 投票
2 回答
12387 浏览
提问于 2025-04-17 17:41

我有一段代码,链接在这里:https://github.com/italomaia/flask-empty/blob/master/src/0.8/main.py,我在文件的最后写了以下内容:

def configure_before_request(app):
    @app.before_request
    def before_request():
        hash = pbkdf2_sha256.encrypt(app.config['PASSWORD'], rounds=8000, salt_size=10)
        if session.get('logged_in') != hash:
            return redirect(url_for('login'))
def configure_views(app):
    @app.route('/login/', methods=['GET', 'POST'])
    def login():
        if request.method == 'POST':
            hash = pbkdf2_sha256.encrypt(app.config['PASSWORD'], rounds=8000, salt_size=10)
            if request.form['login'] == app.config['USERNAME'] and pbkdf2_sha256.verify(request.form['password'], hash):
                session['logged_in'] = hash
                return redirect(url_for('index'))
            else:
                flash(u'Неверный логин или пароль')
        return render_template('login.html')

    @app.route('/', methods=['GET', 'POST'])
    def index():
        return 'index_page НАХ.'

当我运行这段代码时,出现了302服务器错误(ERR_TOO_MANY_REDIRECTS),但是如果我把这行代码return redirect(url_for('login'))改成return 'Hello!',就没有错误了!我到底哪里出错了呢?

2 个回答

1

if session.get('logged_in') != hash:

替换为

if session.get('logged_in') != hash and request.endpoint != 'login':

这个回答是对问题的一个编辑,问题是为什么在flask.redirect中会出现302错误,提问者是Nolik,根据CC BY-SA 3.0协议发布。

1

我不是Flask方面的专家,但我可以告诉你,你在请求被处理之前使用了一个信号来检查凭证,然后再重定向到处理程序。不过,这样的重定向会导致你的应用再次发起请求,从而再次调用同样的函数,这样就会陷入无限重定向的循环中。
(错误302是针对这种情况的特定HTTP错误)

我的建议是:在每个处理函数中单独检查凭证,或者至少在你的before_request函数中设置一个例外,让它在请求到"login/"时不被调用。

你也可以直接调用处理login/的函数。

撰写回答