Flask - перенаправление и передача аргументов в функцию - PullRequest
0 голосов
/ 26 января 2019

Я внедряю меню языков в свое приложение. Основной 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)

1 Ответ

0 голосов
/ 26 января 2019

Если все, что вы хотите сделать, это обслуживать один и тот же шаблон с новой настройкой language, тогда полезно знать, что home_page() view - это просто функция . Вы можете просто назвать это:

@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-кратный перемещенный ответ), но в то же время сохранить настройку языка, то вы потеряете сохраненную информацию в пути URL и должны записать языковые предпочтения где-то еще . Большинство многоязычных сайтов обычно хранят ваши языковые предпочтения в выделенном файле cookie, но вы также можете использовать объект Flask session (который также является файлом cookie на основе настроек по умолчанию).

Чтобы перенаправить на другой URL-адрес, используйте функцию flask.redirect() , затем прикрепите файл 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'))
...