Home > OS >  werkzeug.routing.BuildError: Could not build url for endpoint 'login' with values ['n
werkzeug.routing.BuildError: Could not build url for endpoint 'login' with values ['n

Time:10-23

url_for points to a valid view still getting the below error. I have tried adding the else block to mitigate the error as well but somehow same error is reported.

werkzeug.routing.BuildError: Could not build url for endpoint 'login' with values ['next']. Did you mean 'core.login' instead?

The code:

from ..extensions import ldap
from .forms import LoginForm

core = Blueprint('core', __name__)

@core.route('/')
@ldap.login_required
def index():
    return render_template('index.html')


@core.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        if g.user:
            return redirect(url_for('index'))
        if request.method == 'POST':
            user = request.form['user']
            passwd = request.form['passwd']
            test = ldap.bind_user(user, passwd)
            if test is None or passwd == '':
                return 'Invalid credentials'
            else:
                session['user_id'] = request.form['user']
                return redirect('/')
    return render_template('sign-in.html', form=form)

@core.route('/logout')
def logout():
    session.pop('user_id', None)
    return redirect(url_for('index'))

I am using python 3.8 and flask 2.0.2.

CodePudding user response:

This is expected behavior since your login endpoint is part of your core blueprint. When using url_for you should use route endpoint name rather than view function name:

url_for('core.login')

As the exception suggests.

If you need to customize what the endpoint is called you can do it like so:

@core.route('/login', methods=['GET', 'POST'], endpoint='my_login')
    ...

url_for('core.my_login')

And if there's any confusion you can always inspect app.url_map to see what routes are defined and what are their endpoint names.

  • Related