Сообщить об ошибке.

Декоратор @route() и метод add_url_rule() приложения Flask Python

Декоратор @app.route() и метод app.add_url_rule() регистрируют URL-адрес, по которому будет доступно соответствующее представление и вызываются экземпляром приложения app фреймворка Flask.

Содержание:

@app.route(rule, **options):

Декоратор @app.route() регистрирует URL-адрес, по которому будет доступно соответствующее представление (расположенное под декоратором), а так же правила маршрутизации входящих запросов. Этот декоратор вызывает метод app.add_url_rule(), реализация которого рассматривается более подробно.

@app.route("/")
def index():
    return "Hello, World!"

Правила маршрутизации входящих запросов (переменные части маршрута) указанные в угловых скобках передаются в соответствующую функцию-представление в качестве аргументов.

@app.route("`/<user>/<username>`")
def user(user, username):
    return f"Hello, {username}! ID-user: {user}"

Подробнее смотрите материал "Правила составления URL-маршрутов во Flask".

Если аргумент endpoint не определен, то по умолчанию в качестве имени конечной точки для маршрута используется имя функции-представления.

Подробное описание аргументов, которые принимает декоратор @app.route() смотрите ниже.

Декоратор @app.route() вызывается экземпляром приложения фреймворка Flask.

app.add_url_rule(rule, endpoint=None, view_func=None, provide_automatic_options=None, **options):

Метод app.add_url_rule() регистрирует URL-адрес, по которому будет доступно соответствующее представление, а так же правила маршрутизации входящих запросов. Декоратор @app.route() - это ссылка для вызова этого метода с аргументом view_func (функция-представление). Они эквивалентны:

@app.route("/")
def index():
    ...

# эквивалентно
def index():
    ...

app.add_url_rule("/", view_func=index)

Правила маршрутизации входящих запросов (переменные части маршрута), указанные в угловых скобках, передаются в соответствующую функцию-представление в качестве аргументов.

def index(id):
    ...

app.add_url_rule("/user/<int:id>", view_func=index)

Смотрите материал "Правила составления URL-маршрутов во Flask".

Если аргумент endpoint не передан, то по умолчанию, в качестве имени конечной точки маршрута используется имя функции-представления. Если функция-представление уже была зарегистрирована для конечной точки, то будет вызвана ошибка.

По умолчанию для аргумента methods установлено значение ['GET']. HTTP-метод HEAD всегда добавляется автоматически, а HTTP-метод OPTIONS добавлен в настройках по умолчанию.

Аргумент view_func не всегда нужно передавать, но если правило участвует в маршрутизации, то имя конечной точки endpoint должно быть связано с функцией-представлением декоратором @app.endpoint().

app.add_url_rule("/", endpoint="index")

@app.endpoint("index")
def index():
    ...

Если функция-представления имеет атрибут required_methods, то HTTP-методы, указанные в этом атрибуте, добавляются к переданным в app.add_url_rule() HTTP-методам. Если у функции-представления есть атрибут provide_automatic_options, то он используется по умолчанию, если одноименный аргумент не определен.

def index():
    if request.method == 'OPTIONS':
        # обработка запроса
        ...
    return 'Hello World!'
# присваиваем атрибуты функции-представлению 
index.provide_automatic_options = False
index.methods = ['GET', 'OPTIONS']

# атрибуты функции `index()` передаются
# в качестве аргументов
app.add_url_rule('/', index)

Подробнее об атрибутах, которые может иметь функция-представление, смотрите в материале "Представления в веб-приложении на Flask".

Список аргументов декоратора @app.route() и метода app.add_url_rule().

Ниже приведены аргументы, которые принимают декоратор @app.route() и метод app.add_url_rule(). Единственное отличие состоит в том, что аргумент view_func в декораторе @app.route() отсутствует, так как за декоратором следует функция-представление, которая и заменяет этот аргумент.

  • rule: правило URL-адреса в виде строки;

  • endpoint: конечная точка для зарегистрированного правила URL-адреса. Сам Flask предполагает, что имя функции-представления является именем конечной точки, если явно она не задана;

  • view_func: функция, вызываемая при обслуживании запроса к предоставленной конечной точке. Если это не предусмотрено, то можно указать функцию позже, сохранив ее в словаре view_functions с конечной точкой в качестве ключа.

  • defaults: словарь с настройками по умолчанию для этого правила.

    @app.route('/users/', defaults={'page': 1})
    @app.route('/users/page/<int:page>')
    def show_users(page):
        pass
    

    Теперь маршрут /users/ будет URL-адресом для страницы с номером 1, а /users/page/N будет URL-адресом для страницы N.

  • subdomain: задает правило для поддомена в случае, если используется сопоставление поддоменов. Если не указано, предполагается субдомен по умолчанию. Обратите внимание, что при использовании этого аргумента необходима установка в конфигурации приложения параметра SERVER_NAME, а так же с версии Flask 1.0, необходимо установить аргумент subdomain_matching=True при создании объекта приложения app.

    from flask import Flask
    
    app = Flask(__name__, subdomain_matching=True)
    app.config['SERVER_NAME'] = "example.com"
    
    @app.route("/")
    def index():
        return "example.com"
    
    @app.route("/", subdomain="<subdomain>")
    def sub_index(subdomain):
        return f'{subdomain}.example.com'
    
  • **options: дополнительные ключевые аргументы, которые будут перенаправлены в базовый объект werkzeug.routing.Rule. Это такие аргументы как:

    • methods=['GET']: это список методов, которым должен быть ограничен маршрут (GET, POST и т. д.). По умолчанию правило просто прослушивает GET (и неявно HEAD). Начиная с Flask 0.6, OPTIONS неявно добавляются и обрабатываются стандартными запросами.

    • redirect_to: если задано, то это должно быть либо строка URL, либо вызываемая функция-представление. В случае вызываемого объекта, он вызывается с адаптером URL, который инициировал сопоставление, и значениями URL в качестве ключевых аргументов и должны возвращать цель для перенаправления, в противном случае это должна быть строка маршрута:

      # Функция, которая генерирует новые URL-адреса
      def foo_with_slug(adapter, id):
          # запросить в базе данных `id` для старого идентификатора.
          return f'foo/{Foo.get_slug_for_id(id)}'
      
      @blueprint.route('/foo/<slug>')
      def all(page):
          ...
      
      # правила перенаправлений на новые URL-адреса
      app.add_url_rule('/some/old/url/<slug>', redirect_to='foo/<slug>') 
      app.add_url_rule('/other/old/url/<int:id>', redirect_to=foo_with_slug)
      
    • strict_slashes=True: если маршрут заканчивается косой чертой, а соответствующий URL-адрес - нет, то перенаправляет на URL-адрес с конечной косой чертой. Например если маршрут задан как @app.route('/section/20/'), а пользователь набрал URL-адрес http://example.org/section/20, то он будет перенаправлен на http://example.org/section/20/;

    • merge_slashes=True: объединяет последовательные косые черты при сопоставлении или создании URL-адресов. Совпадения будут перенаправлены на нормализованный URL. Косые черты в изменяемых частях URL не объединяются. Например URL-адрес http://example.org///section//20 будет нормализован и перенаправлен на http://example.org/section/20.