Маршрутизация запросов
Bottle использует мощный движок маршрутизации для поиска правильного обработчика для каждого запроса. Учебник показывает основы. Этот документ подробно рассматривает расширенные методы и механику правил.
Синтаксис правил
The Router различает два основных типа маршрутов: статические маршруты (например, /contact) и динамические маршруты (например, /hello/<name>). Маршрут, содержащий один или несколько подстановочных знаков, считается динамическим. Все остальные маршруты являются статическими.
Изменено в версии 0.10.
Простейшая форма подстановочного знака состоит из имени, заключенного в угловые скобки (например, <name>). Имя должно быть уникальным для данного маршрута и представлять собой допустимый идентификатор Python (буквенно-цифровой, начинающийся с буквы). Это связано с тем, что подстановочные знаки используются в качестве ключевых аргументов для обратного вызова запроса позже.
Каждый подстановочный знак соответствует одному или нескольким символам, но останавливается на первой косой черте (/). Это эквивалентно регулярному выражению [^/]+ и гарантирует, что сопоставляется только один сегмент пути, и маршруты с более чем одним подстановочным знаком остаются однозначными.
Правило /<action>/<item> сопоставляется следующим образом:
| Путь | Результат |
|---|---|
| /save/123 | {'action': 'save', 'item': '123'} |
| /save/123/ | No Match |
| /save/ | No Match |
| //123 | No Match |
Вы можете изменить точное поведение множеством способов, используя фильтры. Это описано в следующем разделе.
Фильтры подстановочных знаков
Добавлен в версии 0.10.
Фильтры используются для определения более специфических подстановочных знаков и/или преобразования сопоставленной части URL перед передачей ее в обратный вызов. Отфильтрованный подстановочный знак объявляется как <name:filter> или <name:filter:config>. Синтаксис необязательной части конфигурации зависит от используемого фильтра.
Реализованы следующие стандартные фильтры:
- :int сопоставляет (знаковые) цифры и преобразует значение в целое число.
- :float аналогично :int, но для десятичных чисел.
- :path сопоставляет все символы, включая символ косой черты, не жадно, и может использоваться для сопоставления более чем одного сегмента пути.
- :re[:exp] позволяет указать пользовательское регулярное выражение в поле конфигурации. Сопоставленное значение не изменяется.
Вы можете добавить свои собственные фильтры в маршрутизатор. Все, что вам нужно, это функция, которая возвращает три элемента: строку регулярного выражения, вызываемый объект для преобразования фрагмента URL в значение Python и вызываемый объект для обратного преобразования. Функция фильтра вызывается со строкой конфигурации в качестве единственного параметра и может ее обработать, как нужно:
app = Bottle()
def list_filter(config):
''' Matches a comma separated list of numbers. '''
delimiter = config or ','
regexp = r'\d+(%s\d)*' % re.escape(delimiter)
def to_python(match):
return map(int, match.split(delimiter))
def to_url(numbers):
return delimiter.join(map(str, numbers))
return regexp, to_python, to_url
app.router.add_filter('list', list_filter)
@app.route('/follow/<ids:list>')
def follow_users(ids):
for id in ids:
...
Синтаксис устаревшего формата
Изменено в версии 0.10.
Новый синтаксис правил был представлен в Bottle 0.10 для упрощения некоторых общих случаев использования, но старый синтаксис по-прежнему работает, и вы можете найти много примеров кода, использующих его. Различия лучше всего описать на примерах:
| Старый синтаксис | Новый синтаксис |
|---|---|
:name | <name> |
:name#regexp# | <name:re:regexp> |
:#regexp# | <:re:regexp> |
:## | <:re> |
Старайтесь избегать старого синтаксиса в будущих проектах, если это возможно. Он в настоящее время не устарел, но в конечном итоге им станет.
Явное конфигурирование маршрутизации
Декоратор маршрута также может вызываться непосредственно как метод. Это обеспечивает гибкость в сложных настройках, позволяя вам напрямую управлять тем, когда и как выполняется конфигурация маршрутизации.
Вот базовый пример явного конфигурирования маршрутизации для приложения Bottle по умолчанию:
def setup_routing():
bottle.route('/', 'GET', index)
bottle.route('/edit', ['GET', 'POST'], edit)
Фактически, любой Bottle экземпляр маршрутизации может быть настроен аналогичным образом:
def setup_routing(app):
app.route('/new', ['GET', 'POST'], form_new)
app.route('/edit', ['GET', 'POST'], form_edit)
app = Bottle()
setup_routing(app)
© 2009–2017 Marcel Hellkamp
Licensed under the MIT License.
https://bottlepy.org/docs/0.12/routing.html