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

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

url_for 指向一个有效视图仍然出现以下错误。我也尝试添加 else 块来减轻错误,但不知何故报告了相同的错误。

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

代码:

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'))

我正在使用 python 3.8 和 flask 2.0.2。

这是预期的行为,因为您的 login 端点是您的 core 蓝图的一部分。使用 url_for 时,您应该使用路由端点名称而不是视图函数名称:

url_for('core.login')

如异常所示。

如果您需要自定义端点的名称,您可以这样做:

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

url_for('core.my_login')

如果有任何混淆,您可以随时检查 app.url_map 以查看定义了哪些路由以及它们的端点名称是什么。