Проблема с 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)