Flask - how can I always include a language code in a URL?
I have been starting with Flask for a couple of weeks now and am trying to implement i18n and l10n in my Flask application. This is the behavior I really want to implement:
User inputs
website.com
will be redirected towebsite.com/en/
orwebsite.com/fr/
based on their Accept-Languages header or default language.
This is my current implementation:
# main_blueprint.py
mainBlueprint = Blueprint('main', __name__)
@mainBlueprint.route('/')
def index(lang):
return "lang: %" % lang
# application.py
app.register_blueprint(mainBlueprint, url_defaults={'lang': 'en'})
app.register_blueprint(mainBlueprint, url_prefix='/<lang>')
This way, when I type website.com
or website.com/en/
, it will only respond website.com
. If I don't type website.com/fr
, he will reply with /fr/
. However, I want to always enable /en/
, even if this is the default setting.
I tried the url pattern tutorial in the Flask doc, but when I typed website.com
it answered 404 error
. It only worked fine when I include language_code
in the url, which is not the behavior I want.
Thank you in advance!
source to share
It looks like you only need one plan:
app.register_blueprint(mainBlueprint, url_defaults='/<lang>')
But you have to choose the default route behavior:
-
It can return 404:
app.register_blueprint(mainBlueprint, url_defaults='/<lang>')
-
It can be redirected to a drawing
/en
:@mainBlueprint.before_request def x(*args, **kwargs): if not request.view_args.get('lang'): return redirect('/en' + request.full_path) app.register_blueprint(mainBlueprint, url_defaults={'lang': None}) app.register_blueprint(mainBlueprint, url_prefix='/<lang>')
source to share