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