2

私はこのコード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!'すべてエラーなしで動作します。私は何を間違えますか?

ありがとう。

ソリューションの問題を編集します。

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

4

1 に答える 1

1

私はフラスコの専門家ではありません。ただし、明らかに、リクエストがハンドラーにマップされる前にシグナルを使用して資格情報を確認し、ハンドラーにリダイレクトしています。しかし、リダイレクトによってアプリへの別のリクエストがトリガーされ、同じ関数が再度呼び出され、無限のリダイレクト ループに陥ります。(エラー 302 は、この状況に固有の http エラーです)

私のアドバイス: ハンドラー関数ごとに資格情報を確認するか、「login/」への要求が発生したときに呼び出されない before_request 関数に少なくとも例外を作成します。

login/を処理する関数を直接呼び出すことも可能です

于 2013-03-02T15:21:50.923 に答える