问题:为什么我在 flask.redirect 上得到 302 错误

我有这个代码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 'Hello!'上更改此行return redirect(url_for('login')),则所有工作都不会出错!我做错了什么?

谢谢。

编辑解决方案问题。

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

解答

好吧,我不是烧瓶专家。但显然您在请求被映射到处理程序之前使用信号来检查凭据,然后重定向到处理程序。但是重定向反过来会触发对您的应用程序的另一个请求并再次调用相同的函数,从而使您进入无限重定向循环。 (错误 302 是针对这种情况的特定 http 错误)

我的建议:在每个处理程序函数的基础上检查凭据,或者至少对你的 before_request 函数做一个例外,当对 "login/" 的请求发生时,它不会被调用。

_可能_也可以直接调用处理 login/ 的函数

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐