Проблема с Flask Blueprints и перенаправлениями входа

У меня есть пример приложения Flask, которое в основном работает. Базовый URL (/) не требует аутентификации; Тем не менее, у меня есть ресурс в /auth/secured, который требует аутентификации.

Приложение работает очень хорошо, пока пользователь вошел в систему; однако, это бросает werkzeug.routing.BuildError (BuildError: Could not build url for endpoint 'login' with values ['next']. Did you mean 'auth.login' instead?) когда кто-то пытается получить доступ /auth/secured как не прошедший проверку подлинности пользователь, потому что он у меня закодирован так:

@auth.route('/secured')
@ldap.login_required
def secured():
    return 'Login Success! {0}'.format(session)

Я использую Flask Blueprints для своей маршрутизации URL... Я предполагал, что это должно работать...

def create_app(config_name):
    from .main import main as main_blueprint
    from .auth import auth as auth_blueprint

    # Configure the flask instance...
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    # Initialize the application...
    bootstrap.init_app(app)
    db.init_app(app)
    ldap.init_app(app)

    # Blueprint registration
    app.register_blueprint(main_blueprint)
    app.register_blueprint(auth_blueprint, url_prefix='/auth')

    return app

Каталог приложения построен следующим образом:

testapp/
 |
 + config.py
 + manage.py
 + app/
   |
   + __init__.py
   + auth/
     |
     + __init__.py
     + views.py
   + main/
     |
     + __init__.py
     + views.py

Насколько я могу судить, что-то запуталось в моей регистрации проекта; однако, я в растерянности из-за ошибки.

Как заставить неаутентифицированного пользователя правильно перенаправить на /auth/login URL, когда они выходят на /auth/secured как неаутентифицированный пользователь?

1 ответ

Решение

Похоже, есть пара проблем.

Первый - это отсутствующий параметр конфигурации, LDAP_LOGIN_VIEW, По умолчаниюlogin но так как у вас нет представления с именем 'login', вы, вероятно, захотите установить auth.login в вашем конфигурационном файле:

LDAP_LOGIN_VIEW = 'auth.login'

Следующая проблема заключается в том, что ваш auth.login не обрабатывает следующий параметр. Следующий параметр сообщает функции входа в систему, куда перенаправить после успешного входа. Это может вызвать проблему, так как flask-simpleldap передает следующий параметр здесь.

return redirect(url_for(current_app.config['LDAP_LOGIN_VIEW'], 
       next=request.path))

Вы можете получить доступ к следующему параметру через объект запроса.

Пример:

from flask import request
@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)
Другие вопросы по тегам