До этого момента во всех примерах каждый обработчик реагировал на одно правило. Но правил у обработчика может быть и несколько. Типичный пример:
@app.route('/')
@app.route('/index.html')
def index():
return '<h1>Hello</h1>'
Такой обработчик будет работать и при заходе на сам домен foo.com и при явном указании того, что нас интересует — главной страницы foo.com/index.html.
Когда мы описываем динамические сегменты, иногда хочется иметь возможность подставить параметры, если задан более короткий адрес. Скажем, у нас есть страница со списком записей блога и эта страница выводит только ограниченное количество записей за раз с возможностью переключения между этими "порциями". Такое поведение называется "пагинацией (pagination)". Вот как маршрутизация может выглядеть в указанной ситуации:
@app.route('/posts/', defaults={'page': 1})
@app.route('/posts/page/<int:page>')
def list_posts(page):
return # …
Здесь первое правило задаёт реакцию на "сокращённый" путь /posts
. При запросе по этому пути браузер будет перенаправлен на маршрут /posts/page/1
.
Обратите внимание на уточнение "браузер будет перенаправлен" — это будет самое настоящее перенаправление с возвратом кода 301/Redirect и новым путём! Если же просто указать несколько разных путей, а аргументам дать значение по умолчанию, то перенаправления не будет:
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return 'Hello, ' + (name or 'Noname') + '!'
Иногда в проектах, уже работающих какое-то время и имеющих своих пользователей, возникает необходимость изменить правила маршрутизации. Но что делать с запросами, которые будут приходить по "старым координатам"? Их можно перенаправить!
@app.route('/foo/<key>')
@app.route('/some/old/url/<key>', redirect_to='foo/<key>')
def foo(key):
return # …
Здесь все запросы на /some/old/url/…
будут перенаправляться на новый маршрут с одновременной передачей параметров!
Показанный способ перенаправления довольно простой. Существует и более гибкий вариант — передача в аргументе
redirect_to
функции специального вида. Подробнее вы сможете прочитать в документации к Flask, если вдруг вам не хватит простого перенаправления.
Когда вы формируете HTML-страницы, вам практически всегда нужно вставлять в них ссылки на ваши же маршруты. Но записывать URL вручную не стоит, ведь для этого у Flask есть функция url_for
, которая сама правильно формирует URL:
from flask import url_for
# …
@app.route('/')
def index():
# …
@app.route('/posts/', defaults={'page': 1})
@app.route('/posts/page/<int:page>')
def list_posts(page):
return # …
def get_urls():
return [
url_for('index'), # '/'
url_for('list_posts'), # '/posts/'
url_for('list_posts', page=42), # '/posts/page/42'
]
Такие генерируемые URL проще читать, ведь вы указываете не путь, а имя обработчика. К тому же если вы потом поменяете правила маршрутизации, вам не придётся менять URL — при генерации всегда используются актуальные маршруты! А ещё вам не придётся задумываться об экранировании параметров или кодировании строк с Unicode-символами: url_for()
делает и это!
Вам ответят команда поддержки Хекслета или другие студенты.
Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.
Загляните в раздел «Обсуждение»:
Статья «Ловушки обучения»
Вебинар «Как самостоятельно учиться»
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт