Spec-Zone.ru › Bottle 0.12

Маршрутизация запросов

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API