I have been digging around Flask-babel for a while and cant seem to get the url routing with a simple blueprint. Here's the trimmed down app
on my __ init __.py file,
app = Flask(__name__)
babel.init_app(app)
@babel.localeselector
def get_locale():
return g.get('lang_code', 'fr')
from .mod_main import mod_main as main_blueprint
app.register_blueprint(main_blueprint,url_prefix='/<lang_code>')
In the blueprint views.py file
@mod_main.url_defaults
def add_language_code(endpoint, values):
values.setdefault('lang_code', g.lang_code)
@mod_main.url_value_preprocessor
def pull_lang_code(endpoint, values):
g.lang_code = values.pop('lang_code')
@mod_main.route('/', methods=['GET', 'POST'])
def index():
return render_template('main/index.html')
This works perfectly fine as long as i navigate to http://localhost:5000/fr but when I navigate to http://localhost:5000/ (without the lang),i get the 404 error. Normal - since the blueprint is expecting a lang_code as a prefix.
On first time when a user navigates to http://localhost:5000/ (without lang), I expect the site to show pages with the language in 'fr'. If the user then switches it to English, and navigates to http://localhost:5000/, i would like it to show up in english but not in french. Cant seem to get this working !!!
I finally figured out the solution - all I needed to do was add a
before_requestfunction on the app to check for request.view_args and serve the right language based on the session variable.I also figured out the
gvariable in flask is valid only for the active request and cannot be used to store values across requests. (As i was trying to store the lang on the g variable across requests - had to use the session variable to transfer values across requests)I just uploaded a stripped down app implementing babel with blueprints here : https://github.com/shankararul/simple-babel