Reputation: 55
I am learning flask with blueprints and I have the following code example:
from flask import Flask, render_template, Blueprint, g
bp = Blueprint('language', __name__, url_prefix='/<int:language_id>', static_folder='static')
app = Flask(__name__)
@bp.url_defaults
def add_language_id(endpoint, values):
if 'language_id' in g:
values.setdefault('language_id', g.site_id)
else:
g.language_id = 1 # English
@bp.url_value_preprocessor
def pull_language_id(endpoint, values):
g.language_id = values.pop('language_id')
@bp.route('/')
def index():
return render_template('main.html')
@bp.route('/lang')
def language():
return render_template('lang.html')
app.register_blueprint(bp)
if __name__ == '__main__':
app.run()
But I'm getting this error:
werkzeug.routing.BuildError: Could not build url for endpoint 'language' with values ['language_id']. Did you mean 'language.index' instead?
Here is the HTML code:
<ul>
<li>
<a href="{{ url_for('language', language_id=1) }}">English</a>
</li>
</ul>
How do I correct this error?
Upvotes: 1
Views: 1224
Reputation: 21312
Looks like you are missing the Blueprint name (language
) in your url link:
From here:
bp = Blueprint('language', __name__, url_prefix='/<int:language_id>', static_folder='static')
So your link will need to be appended:
<a href="{{ url_for('language.language', language_id=1) }}">English</a>
I would also suggest naming it something different so it doesn't conflict with any other naming convention you might have.
Upvotes: 3