redirect(request.referrer) - ERROR: werkzeug.routing.exceptions.BuildError: Could not build url for endpoint

Рейтинг: 0Ответов: 1Опубликовано: 15.08.2023

При выходе из системы на страницах с @login_required одного из двух blueprint получаю ошибку werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'login'. Did you mean 'login_app.index' instead?
К главному файлу подключены несколько блюпринтов:

from flask import Flask
from payment_app import payment_app_bp
from login_app import login_bp
from error_handlers import errorhandler_bp

app = Flask(__name__)
app.config['SECRET_KEY'] = 'yyazaxkoaxb4w8vgj7a7p1lxfb7gee6n5hx'

app.register_blueprint(login_bp)
app.register_blueprint(payment_app_bp)
app.register_blueprint(errorhandler_bp)

if __name__ == '__main__':
    app.run(debug=True)

Находясь на странице блюпринта payment_app_bp нажимаю на logout - функция из блюпринта login_bp. и получаю ошибку

raise BuildError(endpoint, values, method, self)
werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'login'. 
Did you mean 'login_app.index' instead?

В логауте я использую return redirect(request.referrer) для того чтобы пользователь мог остаться на той странице, где был, когда выйдет (в тех случаях, когда это позволяют права доступа). Сама функция логаута:

@login_bp.route('/logout')
@login_required
def logout():
    try:
        logout_user()
        flash(message=['Вы вышли из аккаунта', ''], category='success')

        return redirect(request.referrer)
    except Exception as e:
        return f'logout Ошибка {e}'

Я понимаю, что ошибка из-за использования request.referrer. Ошибки не было, пока я не начал использовать Blueprint. Всё было ОК, пользователь переходил на страницу 403 если выходил из сети на страницах с @login_required:

@payment_app_bp.route('/payment-approval')
@login_required
def get_unapproved_payments():
    """Выгрузка из БД списка несогласованных платежей"""
    try:
        # Check if the user has access to the "List of contracts" page
        if current_user.get_role() != 1:
            return abort(403)
        else:

Как справиться с этой ошибкой оставив возможность пользователям оставаться на текущей страницу при выходе из системы?

Полный лог ошибки:

127.0.0.1 - - [15/Aug/2023 14:01:01] "GET /cash-inflow HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\app.py", line 2213, in __call__
    return self.wsgi_app(environ, start_response)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\app.py", line 2193, in wsgi_app
    response = self.handle_exception(e)
               ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\app.py", line 2190, in wsgi_app
    response = self.full_dispatch_request()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\app.py", line 1486, in full_dispatch_request
    rv = self.handle_user_exception(e)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\app.py", line 1484, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\app.py", line 1469, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask_login\utils.py", line 285, in decorated_view
    return current_app.login_manager.unauthorized()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask_login\login_manager.py", line 196, in unauthorized
    redirect_url = make_login_url(login_view, next_url=request.url)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask_login\utils.py", line 120, in login_url
    base = expand_login_view(login_view)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask_login\utils.py", line 97, in expand_login_view
    return url_for(login_view)
           ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\helpers.py", line 225, in url_for
    return current_app.url_for(
           ^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\app.py", line 1697, in url_for
    return self.handle_url_build_error(error, endpoint, values)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\flask\app.py", line 1686, in url_for
    rv = url_adapter.build(  # type: ignore[union-attr]
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\PycharmProjects\kpln\venv\Lib\site-packages\werkzeug\routing\map.py", line 950, in build
    raise BuildError(endpoint, values, method, self)
werkzeug.routing.exceptions.BuildError: Could not build url for endpoint 'login'. Did you mean 'login_app.index' instead?

Ответы

▲ 0

Проблема была в login_bp:

login_manager = LoginManager()
login_manager.login_view = 'login_app.login'

вместо

login_manager = LoginManager()
login_manager.login_view = 'login'