我正在将语言菜单实现到我的应用程序中。 主URL返回默认的英语页面,您可以从那里通过菜单选择其他语言。
这是代码:
@app.route('/')
def home_page(language='en'):
return render_template(f"homepage - {language}.html")
@app.route('/lang=<language>')
def home_page_language(language):
return render_template(f"homepage - {language}.html")
选择一种语言后,URL为foo.foo/lang=foo
,
因此,我想知道是否有一种方法可以重定向到home_page
函数,并同时传递语言参数,以使URL保持整洁(foo.foo
)
答案 0 :(得分:1)
如果您要做的只是使用新的language
设置提供相同的模板,那么有助于了解home_page()
视图只是一个函数。您可以调用它:
@app.route('/lang=<language>')
def home_page_language(language):
return home_page(language)
更好的是,您可以在多个路径下注册视图,这里实际上不需要第二个功能;只需将/lang=<language>
注册移至home_page()
函数:
@app.route('/')
@app.route('/lang=<language>')
def home_page(language='en'):
return render_template(f"homepage - {language}.html")
现在/
将使用'en'
,而/lang=foobar
将使用language='foobar'
调用相同的函数。
如果您希望将浏览器实际重定向到/
URL(使用30倍移动响应),但同时保留语言设置,则会丢失您存储在网址路径中的信息,并且必须记录语言偏好其他地方。大多数多语言站点通常将您的语言首选项存储在专用Cookie中,但您也可以使用Flask session
object(默认设置中也基于cookie)。
要重定向到其他URL,请使用flask.redirect()
function,然后将cookie附加到生成的响应对象上(使用Response.set_cookie()
。
您的首页将需要在同一Cookie中查找语言设置,不将成为URL的一部分;我在这里使用了专用的cookie来存储此信息:
from flask import redirect, request, url_for
@app.route('/')
def home_page():
language = request.cookies.get('language', 'en')
return render_template(f"homepage - {language}.html")
@app.route('/lang=<language>')
def home_page_language(language):
redirected = redirect(url_for('home_page'))
redirected.set_cookie('language', language)
return redirected
如果要将这些信息存储在会话对象中,则不必手动更新重定向响应,Flask框架会为您透明地处理该问题:
from flask import session, redirect, url_for
@app.route('/')
def home_page():
language = session.get('language', 'en')
return render_template(f"homepage - {language}.html")
@app.route('/lang=<language>')
def home_page_language(language):
session['language'] = language
return redirect(url_for('home_page'))