Маршрутизация URL
При объединении нескольких функций контроллера или представления (как угодно их назвать) требуется диспетчер. Простым способом будет применение тестов на основе регулярных выражений к PATH_INFO и вызов зарегистрированных функций обратного вызова, возвращающих значение.
Werkzeug предоставляет гораздо более мощную систему, аналогичную Routes. Все объекты, упомянутые на этой странице, необходимо импортировать из werkzeug.routing, а не из werkzeug!
Быстрый старт
Вот простой пример, который может быть определением URL для блога:
from werkzeug.routing import Map, Rule, NotFound, RequestRedirect
url_map = Map([
Rule('/', endpoint='blog/index'),
Rule('/<int:year>/', endpoint='blog/archive'),
Rule('/<int:year>/<int:month>/', endpoint='blog/archive'),
Rule('/<int:year>/<int:month>/<int:day>/', endpoint='blog/archive'),
Rule('/<int:year>/<int:month>/<int:day>/<slug>',
endpoint='blog/show_post'),
Rule('/about', endpoint='blog/about_me'),
Rule('/feeds/', endpoint='blog/feeds'),
Rule('/feeds/<feed_name>.rss', endpoint='blog/show_feed')
])
def application(environ, start_response):
urls = url_map.bind_to_environ(environ)
try:
endpoint, args = urls.match()
except HTTPException, e:
return e(environ, start_response)
start_response('200 OK', [('Content-Type', 'text/plain')])
return [f'Rule points to {endpoint!r} with arguments {args!r}'.encode()]
Итак, что это делает? Во-первых, мы создаём новый Map, который хранит множество правил URL. Затем мы передаём ему список объектов Rule.
Каждый объект Rule инициализируется строкой, представляющей правило, и конечной точкой, которая будет псевдонимом для того представления, которое оно представляет. Несколько правил могут иметь одну и ту же конечную точку, но должны иметь разные аргументы, чтобы разрешить построение URL.
Формат правил URL прост, но подробно объяснён ниже.
Внутри WSGI-приложения мы привязываем url_map к текущему запросу, что вернёт новый MapAdapter. Этот адаптер url_map можно затем использовать для сопоставления или построения доменных имён для текущего запроса.
Метод MapAdapter.match() может вернуть кортеж в формате (endpoint, args) или вызвать одно из трёх исключений NotFound, MethodNotAllowed или RequestRedirect. Более подробную информацию об этих исключениях можно найти в документации метода MapAdapter.match().
Формат правила
Строки правил — это пути URL с плейсхолдерами для переменных частей в формате <converter(arguments):name>. converter и arguments (в скобках) необязательны. Если преобразователь не указан, используется преобразователь default (по умолчанию string). Доступные преобразователи обсуждаются ниже.
Правила, заканчивающиеся слешем, являются «ветвями», другие — «листьями». Если strict_slashes включено (по умолчанию), посещение URL-адреса ветви без заключительного слэша перенаправит на URL-адрес с добавленным слешем.
Многие HTTP-серверы объединяют последовательные слеши в один при получении запросов. Если merge_slashes включено (по умолчанию), правила будут объединять слеши в непеременных частях при сопоставлении и построении. Посещение URL-адреса с последовательными слешами перенаправит на URL-адрес со слитыми слешами. Если вы хотите отключить merge_slashes для Rule или Map, вам также необходимо соответствующим образом настроить свой веб-сервер.
Встроенные преобразователи
Встроенные преобразователи для распространённых типов переменных URL. Доступные преобразователи можно переопределить или расширить через Map.converters.
-
class werkzeug.routing.UnicodeConverter(map, minlength=1, maxlength=None, length=None) -
Этот преобразователь является стандартным и принимает любую строку, но только один сегмент пути. Таким образом, строка не может содержать слэш.
Это стандартный валидатор.
Пример:
Rule('/pages/<page>'), Rule('/<string(length=2):lang_code>')
-
class werkzeug.routing.PathConverter(map, *args, **kwargs) -
Аналогичен стандартному преобразователю
UnicodeConverter, но также сопоставляет слэши. Это полезно для вики и аналогичных приложений:Rule('/<path:wikipage>') Rule('/<path:wikipage>/edit')
-
class werkzeug.routing.AnyConverter(map, *items) -
Сопоставляет один из указанных элементов. Элементы могут быть Python-идентификаторами или строками:
Rule('/<any(about, help, imprint, class, "foo,bar"):page_name>')- Параметры:
Изменения
Изменено в версии 2.2: Значение проверяется при построении URL.
-
class werkzeug.routing.IntegerConverter(map, fixed_digits=0, min=None, max=None, signed=False) -
Этот преобразователь принимает только целые значения:
Rule("/page/<int:page>")По умолчанию он принимает только беззнаковые положительные значения. Параметр
signedвключит беззнаковые отрицательные значения.Rule("/page/<int(signed=True):page>")- Параметры:
-
-
map (Map) –
Map. -
fixed_digits (int) – число фиксированных цифр в URL. Если вы установите его в
4например, правило будет соответствовать только если URL выглядит как/0001/. По умолчанию длина переменная. - min (int | None) – минимальное значение.
- max (int | None) – максимальное значение.
- signed (bool) – Разрешить знаковые (отрицательные) значения.
-
map (Map) –
Изменения
Добавлен в версии 0.15: Параметр
signed.
-
class werkzeug.routing.FloatConverter(map, min=None, max=None, signed=False) -
Этот преобразователь принимает только значения с плавающей точкой:
Rule("/probability/<float:probability>")По умолчанию он принимает только беззнаковые положительные значения. Параметр
signedвключит беззнаковые отрицательные значения.Rule("/offset/<float(signed=True):offset>")- Параметры:
Изменения
Добавлен в версии 0.15: Параметр
signed.
Карты, Правила и Адаптеры
-
class werkzeug.routing.Map(rules=None, default_subdomain='', strict_slashes=True, merge_slashes=True, redirect_defaults=True, converters=None, sort_parameters=False, sort_key=None, host_matching=False) -
Класс карты хранит все правила URL и некоторые параметры конфигурации. Некоторые значения конфигурации хранятся только на экземпляре
Map, так как они влияют на все правила, другие являются просто значениями по умолчанию и могут быть переопределены для каждого правила. Обратите внимание, что вы должны указать все аргументы, кромеrules, в качестве именованных аргументов!- Параметры:
-
- rules (t.Iterable[RuleFactory] | None) – последовательность правил URL для этой карты.
- default_subdomain (строка) – По умолчанию домен для правил без определенного домена.
- strict_slashes (логическое значение) – Если правило заканчивается косой чертой, а сопоставляемый URL нет, перенаправить на URL с заключительной косой чертой.
- merge_slashes (логическое значение) – Объединить последовательные косые черты при сопоставлении или создании URL-адресов. Сопоставления будут перенаправляться на нормализованный URL. Косые черты в переменных частях не объединяются.
- redirect_defaults (логическое значение) – Это перенаправит на правило по умолчанию, если оно не посещалось таким образом. Это помогает создавать уникальные URL-адреса.
- converters (t.Mapping[строка, тип[BaseConverter]] | None) – Словарь конвертеров, который добавляет дополнительные конвертеры в список конвертеров. Если вы переопределите конвертер, это переопределит исходный конвертер.
-
sort_parameters (логическое значение) – Если установлено значение
True, параметры URL сортируются. Подробнее см.url_encode. -
sort_key (t.Callable[[t.Any], t.Any] | None) – Функция ключа сортировки для
url_encode. -
host_matching (логическое значение) – если установлено значение
True, это включит функцию соответствия хосту и отключит функцию соответствия поддоменам. При включении параметрhostправил используется вместо параметраsubdomain.
Изменено в версии 3.0: Параметры
charsetиencoding_errorsбыли удалены.Изменения
Изменено в версии 1.0: Если
url_schemeимеет значениеwsилиwss, будут сопоставляться только правила WebSocket.Изменено в версии 1.0: Параметр
merge_slashesбыл добавлен.Изменено в версии 0.7: Параметры
encoding_errorsиhost_matchingбыли добавлены.Изменено в версии 0.5: Параметры
sort_parametersиsort_keyбыли добавлены.-
converters -
Словарь конвертеров. Его можно изменить после создания класса, но это повлияет только на правила, добавленные после изменения. Если правила определены со списком, переданным в класс, вместо него нужно использовать параметр
convertersконструктора.
-
add(rulefactory) -
Добавить новое правило или фабрику в карту и связать её. Требует, чтобы правило не было связано с другой картой.
- Параметры:
-
rulefactory (RuleFactory) –
RuleилиRuleFactory - Тип возвращаемого значения:
-
None
-
bind(server_name, script_name=None, subdomain=None, url_scheme='http', default_method='GET', path_info=None, query_args=None) -
Возвращает новый
MapAdapterс указанными подробностями. Обратите внимание, чтоscript_nameпо умолчанию будет'/', если не указано иначе, илиNone. Параметрserver_nameпо крайней мере необходим, потому что RFC HTTP требует абсолютных URL-адресов для перенаправлений, и поэтому все исключения перенаправления, возбуждаемые Werkzeug, будут содержать полный канонический URL-адрес.Если параметр path_info не передан в
match(), он будет использовать путь по умолчанию, переданный в bind. Хотя это не имеет смысла для вызовов bind вручную, это полезно, если вы связываете карту с окружением WSGI, которое уже содержит путь.subdomainпо умолчанию будетdefault_subdomainдля этой карты, если не определено. Еслиdefault_subdomainотсутствует, вы не можете использовать функцию поддоменов.Изменения
Изменено в версии 1.0: Если
url_schemeимеет значениеwsилиwss, будут сопоставляться только правила WebSocket.Изменено в версии 0.15:
path_infoпо умолчанию'/', еслиNone.Изменено в версии 0.8:
query_argsможет быть строкой.Изменено в версии 0.7: Добавлен параметр
query_args.
-
bind_to_environ(environ, server_name=None, subdomain=None) -
Как
bind(), но вы можете передать ему среду WSGI, и она извлечёт информацию из этого словаря. Обратите внимание, что из-за ограничений протокола нет способа получить текущий домен и фактическийserver_nameиз среды. Если вы этого не сделаете, Werkzeug будет использоватьSERVER_NAMEиSERVER_PORT(илиHTTP_HOSTпри его наличии) как используемыеserver_nameс отключённой функцией поддоменов.Если
subdomainNone, но приведена среда и имя сервера, текущий поддомен будет рассчитан автоматически. Например, еслиserver_name'example.com', иSERVER_NAMEв wsgienviron'staging.dev.example.com', рассчитанный поддомен будет'staging.dev'.Если переданный объект environ имеет атрибут environ, используется значение этого атрибута. Это позволяет передавать объекты запросов. Кроме того,
PATH_INFOдобавлен в качестве значения по умолчаниюMapAdapter, чтобы вам не приходилось передавать информацию о пути в метод сопоставления.Changelog
Изменено в версии 1.0.0: Если переданное имя сервера указывает порт 443, оно будет соответствовать, если входящий протокол
httpsбез порта.Изменено в версии 1.0.0: Отображается сообщение об ошибке, если переданное имя сервера не соответствует входящему имени сервера WSGI.
Изменено в версии 0.8: Это больше не будет вызывать ValueError, если было передано неожиданное имя сервера.
Изменено в версии 0.5: ранее этот метод принимал ошибочный
calculate_subdomainпараметр, который не имел никакого эффекта. Он был удалён из-за этого.- Параметры:
- Тип возвращаемого значения:
-
default_converters = {'any': <class 'werkzeug.routing.converters.AnyConverter'>, 'default': <class 'werkzeug.routing.converters.UnicodeConverter'>, 'float': <class 'werkzeug.routing.converters.FloatConverter'>, 'int': <class 'werkzeug.routing.converters.IntegerConverter'>, 'path': <class 'werkzeug.routing.converters.PathConverter'>, 'string': <class 'werkzeug.routing.converters.UnicodeConverter'>, 'uuid': <class 'werkzeug.routing.converters.UUIDConverter'>} -
Словарь преобразующих по умолчанию для использования.
-
is_endpoint_expecting(endpoint, *arguments) -
Перебирает все правила и проверяет, ожидает ли конечная точка переданные аргументы. Это полезно, например, если у вас есть некоторые URL-адреса, которые ожидают код языка, а другие — нет, и вы хотите немного обернуть конструктор, чтобы код текущего языка автоматически добавлялся, если он не предоставлен, но конечные точки его ожидают.
-
iter_rules(endpoint=None) -
Перебирает все правила или правила конечной точки.
-
lock_class() -
Тип блокировки для использования при обновлении.
Changelog
Новое в версии 1.0.
-
update() -
Вызывается перед сопоставлением и построением, чтобы сохранить скомпилированные правила в правильном порядке после изменений.
- Тип возвращаемого значения:
-
None
-
-
class werkzeug.routing.MapAdapter(map, server_name, script_name, subdomain, url_scheme, path_info, default_method, query_args=None) -
Возвращается методом
Map.bind()илиMap.bind_to_environ()и выполняет сопоставление и построение URL на основе данных во время выполнения.- Параметры:
-
allowed_methods(path_info=None) -
Возвращает допустимые методы, соответствующие заданному пути.
Изменения
Введено в версии 0.7.
-
build(endpoint, values=None, method=None, force_external=False, append_unknown=True, url_scheme=None) -
Построение URL происходит практически в обратном порядке. Вместо
matchвы вызываетеbuildи передаёте ему конечную точку и словарь аргументов для заполнителей.Функция
buildтакже принимает аргумент, называемыйforce_external, который, если вы зададите его какTrue, заставит использовать внешние URL-адреса. По умолчанию внешние URL-адреса (включая имя сервера) используются только в том случае, если целевой URL-адрес находится на другом домене.>>> m = Map([ ... Rule('/', endpoint='index'), ... Rule('/downloads/', endpoint='downloads/index'), ... Rule('/downloads/<int:id>', endpoint='downloads/show') ... ]) >>> urls = m.bind("example.com", "/") >>> urls.build("index", {}) '/' >>> urls.build("downloads/show", {'id': 42}) '/downloads/42' >>> urls.build("downloads/show", {'id': 42}, force_external=True) 'http://example.com/downloads/42'Так как URL не могут содержать не-ASCII данные, вы всегда получите байты. Символы с кодами, не входящими в ASCII, будут закодированы в соответствии с набором символов, определённым в экземпляре объекта map.
Дополнительные значения преобразуются в строки и добавляются в URL в качестве параметров запроса:
>>> urls.build("index", {'q': 'My Searchstring'}) '/?q=My+Searchstring'При обработке этих дополнительных значений списки также интерпретируются как множественные значения (в соответствии с
werkzeug.datastructures.MultiDict):>>> urls.build("index", {'q': ['a', 'b', 'c']}) '/?q=a&q=b&q=c'Передача
MultiDictтакже добавит несколько значений:>>> urls.build("index", MultiDict((('p', 'z'), ('q', 'a'), ('q', 'b')))) '/?p=z&q=a&q=b'Если правило не существует при построении
BuildErrorвозникает исключение.Метод build принимает аргумент, называемый
method, который позволяет указать метод, для которого нужно построить URL, если для одной и той же конечной точки определены разные методы.- Параметры:
-
- endpoint (str) – конечная точка URL для построения.
- values (Mapping[str, Any] | None) – значения для построения URL. Необработанные значения добавляются в URL в качестве параметров запроса.
- method (str | None) – HTTP-метод для правила, если для одной и той же конечной точки имеются разные URL для разных методов.
- force_external (bool) – принудительно использовать полные канонические внешние URL. Если схема URL не указана, это создаст URL с протоколом-относительным URL.
- append_unknown (bool) – неизвестные параметры добавляются к сгенерированному URL в качестве параметра строки запроса. Отключите это, если вы хотите, чтобы билдер игнорировал их.
-
url_scheme (str | None) – Схема, используемая вместо привязанного
url_scheme.
- Тип возвращаемого значения:
Изменения
Изменено в версии 2.0: Добавлен параметр
url_scheme.Введено в версии 0.6: Добавлен параметр
append_unknown.
-
dispatch(view_func, path_info=None, method=None, catch_http_exceptions=False) -
Выполняет полный процесс диспетчеризации.
view_funcвызывается с конечной точкой и словарем значений для представления. Он должен найти функцию представления, вызвать её и вернуть объект ответа или WSGI-приложение. Исключения http по умолчанию не обрабатываются, чтобы приложения могли отображать более удобные сообщения об ошибках, просто перехватывая их вручную. Если вы хотите использовать стандартные сообщения об ошибках, вы можете передатьcatch_http_exceptions=True, и он перехватит исключения http.Вот небольшой пример использования диспетчера:
from werkzeug.wrappers import Request, Response from werkzeug.wsgi import responder from werkzeug.routing import Map, Rule def on_index(request): return Response('Hello from the index') url_map = Map([Rule('/', endpoint='index')]) views = {'index': on_index} @responder def application(environ, start_response): request = Request(environ) urls = url_map.bind_to_environ(environ) return urls.dispatch(lambda e, v: views[e](request, **v), catch_http_exceptions=True)Обратите внимание, что этот метод также может возвращать объекты исключений, поэтому используйте
Response.force_typeдля получения объекта ответа.- Параметры:
-
- view_func (t.Callable[[str, t.Mapping[str, t.Any]], WSGIApplication]) – функция, которая вызывается с конечной точкой в качестве первого аргумента и словарем значений во втором. Должна перенаправлять на фактическую функцию представления с этой информацией. (см. выше)
- path_info (str | None) – информация о пути для сопоставления. Переопределяет информацию о пути, указанную при привязке.
- method (str | None) – HTTP-метод, используемый для сопоставления. Переопределяет метод, указанный при привязке.
-
catch_http_exceptions (bool) – установить в
Trueдля перехвата любых исключений werkzeugHTTPException.
- Тип возвращаемого значения:
-
WSGIApplication
-
make_alias_redirect_url(path, endpoint, values, method, query_args) -
Внутренний вызов для создания URL перенаправления псевдонима.
-
match(path_info: str | None = None, method: str | None = None, return_rule: Literal[False] = False, query_args: Mapping[str, Any] | str | None = None, websocket: bool | None = None) → tuple[str, Mapping[str, Any]] - match(path_info:str|None=None, method:str|None=None, return_rule:Literal[True]=True, query_args:Mapping[str,Any]|str|None=None, websocket:bool|None=None) tuple[werkzeug.routing.rules.Rule,Mapping[str,Any]]
-
Использование простое: вы передаете методу match текущую информацию о пути, а также метод (который по умолчанию равен
GET). После этого могут произойти следующие события:- получение исключения
NotFound, указывающего, что ни один URL не соответствует. ИсключениеNotFoundтакже является WSGI-приложением, которое можно вызвать для получения страницы по умолчанию с ошибкой «страница не найдена» (оно совпадает с объектомwerkzeug.exceptions.NotFound). - получение исключения
MethodNotAllowed, указывающего, что для данного URL есть соответствие, но нет соответствия для текущего метода запроса. Это полезно для RESTful-приложений. - получение исключения
RequestRedirectс атрибутомnew_url. Это исключение используется для уведомления о запросе Werkzeug от вашего WSGI-приложения. Например, это происходит, если вы запрашиваете/foo, хотя правильный URL —/foo/. ОбъектRequestRedirectможно использовать как объект ответа, аналогично всем другим подклассамHTTPException. - получение исключения
WebsocketMismatch, если единственным соответствием является правило WebSocket, но привязка — запрос HTTP, или если соответствие — правило HTTP, но привязка — запрос WebSocket. - получение кортежа вида
(endpoint, arguments), если есть соответствие (еслиreturn_ruleне равно True, в противном случае вы получите кортеж вида(rule, arguments)).
Если информация о пути не передается в метод match, используется информация о пути по умолчанию для карты (по умолчанию — корневой URL, если он не определен явно).
Все поднятые исключения являются подклассами
HTTPException, поэтому их можно использовать в качестве ответов WSGI. Они все будут отображать общие страницы ошибок или перенаправления.Вот небольшой пример соответствия:
>>> m = Map([ ... Rule('/', endpoint='index'), ... Rule('/downloads/', endpoint='downloads/index'), ... Rule('/downloads/<int:id>', endpoint='downloads/show') ... ]) >>> urls = m.bind("example.com", "/") >>> urls.match("/", "GET") ('index', {}) >>> urls.match("/downloads/42") ('downloads/show', {'id': 42})И вот что происходит при перенаправлении и отсутствии URL:
>>> urls.match("/downloads") Traceback (most recent call last): ... RequestRedirect: http://example.com/downloads/ >>> urls.match("/missing") Traceback (most recent call last): ... NotFound: 404 Not Found- Параметры:
-
- path_info – информация о пути, используемая для сопоставления. Переопределяет информацию о пути, указанную при привязке.
- method – метод HTTP, используемый для сопоставления. Переопределяет метод, указанный при привязке.
-
return_rule – возвращает правило, которое сопоставилось, а не только конечную точку (по умолчанию
False). - query_args – необязательные аргументы запроса, используемые для автоматического перенаправления в виде строки или словаря. В настоящее время невозможно использовать аргументы запроса для сопоставления URL.
-
websocket – Сопоставлять запросы WebSocket вместо запросов HTTP. Запрос WebSocket имеет
wsилиwssurl_scheme. Это переопределяет это определение.
Журнал изменений
Добавлен в версии 1.0: Добавлен
websocket.Изменено в версии 0.8:
query_argsможет быть строкой.Добавлен в версии 0.7: Добавлен
query_args.Добавлен в версии 0.6: Добавлен
return_rule. - получение исключения
-
test(path_info=None, method=None) -
Проверка соответствия правила. Работает как
match, но возвращаетTrue, если URL соответствует, илиFalse, если его нет.
-
-
class werkzeug.routing.Rule(string, defaults=None, subdomain=None, methods=None, build_only=False, endpoint=None, strict_slashes=None, merge_slashes=None, redirect_to=None, alias=False, host=None, websocket=False) -
Правило представляет собой один шаблон URL. Существуют некоторые параметры
Rule, которые изменяют его поведение и передаются конструкторуRule. Обратите внимание, что помимо строки правила все аргументы должны быть именованными аргументами, чтобы не нарушить работу приложения при обновлении Werkzeug.-
string -
Строки правил по сути представляют собой обычные пути URL с плейсхолдерами в формате
<converter(arguments):name>, где преобразователь и аргументы являются необязательными. Если преобразователь не определён, используется преобразовательdefault, что означаетstringв стандартной конфигурации.Правила URL, заканчивающиеся слешем, являются правилами ветвей, другие — правилами листьев. Если у вас включены
strict_slashes(что является значением по умолчанию), все правила ветвей, которые сопоставляются без заключительного слеша, будут перенаправлять на тот же URL с добавленным недостающим слешем.Преобразователи определены в
Map. -
endpoint -
Конечная точка для данного правила. Это может быть что угодно. Ссылка на функцию, строку, число и т. д. Предпочтительный способ — использование строки, поскольку конечная точка используется для генерации URL.
-
defaults -
Необязательный словарь с значениями по умолчанию для других правил с той же конечной точкой. Это немного сложно, но полезно, если вы хотите иметь уникальные URL:
url_map = Map([ Rule('/all/', defaults={'page': 1}, endpoint='all_entries'), Rule('/all/page/<int:page>', endpoint='all_entries') ])Если пользователь теперь посетит
http://example.com/all/page/1, он будет перенаправлен наhttp://example.com/all/. Еслиredirect_defaultsотключено для экземпляраMapэто повлияет только на генерацию URL. -
subdomain -
Строка правила поддомена для данного правила. Если не указано, правило соответствует только
default_subdomainкарты. Если карта не привязана к поддомену, эта функция отключена.Может быть полезно, если вы хотите иметь профили пользователей на разных поддоменах и все поддомены перенаправляются в ваше приложение:
url_map = Map([ Rule('/', subdomain='<username>', endpoint='user/homepage'), Rule('/stats', subdomain='<username>', endpoint='user/stats') ]) -
methods -
Последовательность HTTP-методов, к которым применяется это правило. Если не указано, разрешены все методы. Например, это может быть полезно, если вы хотите иметь разные конечные точки для
POSTиGET. Если методы определены и путь совпадает, но метод не указан в этом списке или в списке другого правила для этого пути, поднимается ошибка типаMethodNotAllowedвместоNotFound. ЕслиGETприсутствует в списке методов, аHEADотсутствует,HEADдобавляется автоматически. -
strict_slashes -
Переопределение настройки
Mapдляstrict_slashesтолько для этого правила. Если не указано, используется настройкаMap. -
merge_slashes -
Переопределяет
Map.merge_slashesдля этого правила. -
build_only -
Установите это значение в True, и правило никогда не будет соответствовать, но будет генерировать URL. Это полезно, если у вас есть ресурсы на поддомене или в папке, которые не обрабатываются приложением WSGI (например, статические данные).
-
redirect_to -
Если задано, это значение должно быть либо строкой, либо вызываемой функцией. В случае вызываемой функции она вызывается с адаптером URL, который вызвал соответствие, и значениями URL в виде именованных аргументов и должна возвращать цель для перенаправления, в противном случае это должна быть строка с плейсхолдерами в синтаксисе правил:
def foo_with_slug(adapter, id): # ask the database for the slug for the old id. this of # course has nothing to do with werkzeug. return f'foo/{Foo.get_slug_for_id(id)}' url_map = Map([ Rule('/foo/<slug>', endpoint='foo'), Rule('/some/old/url/<slug>', redirect_to='foo/<slug>'), Rule('/other/old/url/<int:id>', redirect_to=foo_with_slug) ])При соответствии правила система маршрутизации поднимет исключение
RequestRedirectс целью перенаправления.Помните, что URL будет объединён с корневым URL скрипта, поэтому не используйте ведущий слеш в целевом URL, если вы не имеете в виду корень этого домена.
-
alias -
Если включено, это правило служит псевдонимом для другого правила с той же конечной точкой и аргументами.
-
host -
Если задано и в карте URL включено соответствие по хосту, это можно использовать для предоставления правила соответствия для всего хоста. Это также означает, что функция поддомена отключена.
-
websocket -
Если
True, это правило соответствует только запросам WebSocket (ws://,wss://). По умолчанию правила соответствуют только HTTP-запросам.
Changelog
Изменено в версии 2.1: Кодированные процентами новые строки (
%0a), которые декодируются серверами WSGI, учитываются при маршрутизации, а не прерывают соответствие.Добавлена в версии 1.0: Добавлена
websocket.Добавлена в версии 1.0: Добавлена
merge_slashes.Добавлена в версии 0.7: Добавлены
aliasиhost.Изменено в версии 0.6.1:
HEADдобавлен вmethodsеслиGETприсутствует.- Parameters:
-
- string (str) –
- defaults (t.Mapping[str, t.Any] | None) –
- subdomain (str | None) –
- methods (t.Iterable[str] | None) –
- build_only (bool) –
- endpoint (str | None) –
- strict_slashes (bool | None) –
- merge_slashes (bool | None) –
- redirect_to (str | t.Callable[..., str] | None) –
- alias (bool) –
- host (str | None) –
- websocket (bool) –
-
empty() -
Возвращает не связанную копию этого правила.
Это может быть полезно, если вы хотите повторно использовать уже связанный URL для другой карты. См.
get_empty_kwargsдля переопределения набора именованных аргументов, которые будут предоставлены новой копии.- Return type:
-
Matchers
-
class werkzeug.routing.StateMachineMatcher(merge_slashes) -
- Parameters:
-
merge_slashes (bool) –
Правила-фабрики
-
class werkzeug.routing.RuleFactory -
При работе со сложными настройками URL рекомендуется использовать фабрики правил, чтобы избежать повторяющихся задач. Некоторые из них встроенные, другие можно добавить, унаследовав от
RuleFactoryи переопределивget_rules.
-
class werkzeug.routing.Subdomain(subdomain, rules) -
Все URL, предоставляемые этой фабрикой, имеют домен, установленный для определённого домена. Например, если вы хотите использовать поддомен для текущего языка, это может быть хорошее решение:
url_map = Map([ Rule('/', endpoint='#select_language'), Subdomain('<string(length=2):lang_code>', [ Rule('/', endpoint='index'), Rule('/about', endpoint='about'), Rule('/help', endpoint='help') ]) ])Теперь все правила, кроме конечной точки
'#select_language', будут прослушивать поддомены длиной в две буквы, содержащие код языка текущего запроса.- Параметры:
-
- subdomain (строка) –
- rules (t.Iterable[Правило-фабрика]) –
-
class werkzeug.routing.Submount(path, rules) -
Как и
Subdomain, но добавляет правило URL с указанной строкой в префикс:url_map = Map([ Rule('/', endpoint='index'), Submount('/blog', [ Rule('/', endpoint='blog/index'), Rule('/entry/<entry_slug>', endpoint='blog/show') ]) ])Теперь правило
'blog/show'соответствует/blog/entry/<entry_slug>.- Параметры:
-
- path (строка) –
- rules (t.Iterable[Правило-фабрика]) –
-
class werkzeug.routing.EndpointPrefix(prefix, rules) -
Добавляет префикс ко всем конечным точкам (которые должны быть строками для этой фабрики) с другой строкой. Это может быть полезно для подприложений:
url_map = Map([ Rule('/', endpoint='index'), EndpointPrefix('blog/', [Submount('/blog', [ Rule('/', endpoint='index'), Rule('/entry/<entry_slug>', endpoint='show') ])]) ])- Параметры:
-
- prefix (строка) –
- rules (t.Iterable[Правило-фабрика]) –
Шаблоны правил
-
class werkzeug.routing.RuleTemplate(rules) -
Возвращает копии правил, обернутых и расширяет строковые шаблоны в конечной точке, правиле, значениях по умолчанию или разделе поддомена.
Вот небольшой пример такого шаблона правила:
from werkzeug.routing import Map, Rule, RuleTemplate resource = RuleTemplate([ Rule('/$name/', endpoint='$name.list'), Rule('/$name/<int:id>', endpoint='$name.show') ]) url_map = Map([resource(name='user'), resource(name='page')])Когда вызывается шаблон правила, ключевые аргументы используются для замены заполнитель в строковых параметрах.
- Параметры:
-
rules (t.Iterable[Правило]) –
Пользовательские преобразователи
Вы можете добавить пользовательские преобразователи, которые добавляют поведение, не предоставляемое встроенными преобразователями. Для создания пользовательского преобразователя необходимо унаследовать от BaseConverter , затем передать новый класс параметру Map converters параметра или добавить его в url_map.converters.
Преобразователь должен иметь атрибут regex с регулярным выражением для соответствия. Если преобразователь может принимать аргументы в правиле URL, он должен принимать их в методе __init__. Весь выражение регулярного выражения будет сопоставлено как группа и использоваться в качестве значения для преобразования.
Если пользовательский преобразователь может сопоставить обратный слэш, /, он должен иметь атрибут part_isolating установленный на значение False. Это гарантирует, что правила, использующие пользовательский преобразователь, будут правильно сопоставлены.
Он может реализовать метод to_python для преобразования сопоставленной строки в другой объект. Это также может выполнить дополнительную проверку, которая не была возможна с атрибутом regex, и в этом случае должно быть поднято исключение werkzeug.routing.ValidationError. Поднятие любых других ошибок приведет к ошибке 500.
Он может реализовать метод to_url для преобразования объекта Python в строку при построении URL. Любая ошибка, поднятая здесь, будет преобразована в werkzeug.routing.BuildError и, в конечном итоге, вызовет ошибку 500.
Этот пример реализует преобразователь BooleanConverter, который будет соответствовать строкам "yes", "no" и "maybe", возвращая случайное значение для "maybe".
from random import randrange
from werkzeug.routing import BaseConverter, ValidationError
class BooleanConverter(BaseConverter):
regex = r"(?:yes|no|maybe)"
def __init__(self, url_map, maybe=False):
super().__init__(url_map)
self.maybe = maybe
def to_python(self, value):
if value == "maybe":
if self.maybe:
return not randrange(2)
raise ValidationError
return value == 'yes'
def to_url(self, value):
return "yes" if value else "no"
from werkzeug.routing import Map, Rule
url_map = Map([
Rule("/vote/<bool:werkzeug_rocks>", endpoint="vote"),
Rule("/guess/<bool(maybe=True):foo>", endpoint="guess")
], converters={'bool': BooleanConverter})
Если вы хотите изменить преобразователь по умолчанию, назначьте другой преобразователь ключу "default".
Сопоставление по хосту
Журнал изменений
Новое в версии 0.7.
Начиная с Werkzeug 0.7, также возможно сопоставление по полному имени хоста, а не только по поддомену. Чтобы включить эту функцию, необходимо передать host_matching=True конструктору Map и предоставить аргумент host для всех маршрутов:
url_map = Map([
Rule('/', endpoint='www_index', host='www.example.com'),
Rule('/', endpoint='help_index', host='help.example.com')
], host_matching=True)
Переменные части, конечно, также возможны в разделе хоста:
url_map = Map([
Rule('/', endpoint='www_index', host='www.example.com'),
Rule('/', endpoint='user_index', host='<user>.example.com')
], host_matching=True)
Веб-сокеты
Журнал изменений
Новое в версии 1.0.
Если Rule создаётся с websocket=True, он будет соответствовать только если Map привязано к запросу с типом url_scheme ws или wss.
Примечание
Werkzeug не имеет дальнейшей поддержки веб-сокетов, помимо маршрутизации. Эта функциональность в основном полезна для проектов ASGI.
url_map = Map([
Rule("/ws", endpoint="comm", websocket=True),
])
adapter = map.bind("example.org", "/ws", url_scheme="ws")
assert adapter.match() == ("comm", {})
Если единственное сопоставление — правило веб-сокета, а привязка — HTTP (или единственное сопоставление — HTTP, а привязка — веб-сокет), возникает исключение WebsocketMismatch (производное от BadRequest).
Поскольку URL веб-сокетов имеют другой протокол, правила всегда создаются с протоколом и хостом, force_external=True подразумевается.
url = adapter.build("comm")
assert url == "ws://example.org/ws"
Сопоставление по состоянию машины
По умолчанию алгоритм сопоставления использует состояние машины, которая переходит между частями пути запроса, чтобы найти совпадение. Чтобы понять, как это работает, рассмотрим это правило:
/resource/<id>
Во-первых, это правило разбивается на две RulePart. Первая — это статическая часть со значением resource, вторая — динамическая и требует соответствия регулярному выражению [^/]+.
Затем создаётся машина состояний с начальным состоянием, которое представляет первую / правила. Это начальное состояние имеет единственную статическую переход к следующему состоянию, которое представляет вторую / правила. Это второе состояние имеет один динамический переход к конечному состоянию, которое включает правило.
Для сопоставления пути поиск начинается с начального состояния и следует переходам, которые работают. Очевидно, что тестовый путь /resource/2 имеет части "", resource, и 2, которые соответствуют переходам, и, следовательно, правило будет сопоставлено. В то время как /other/2 не будет сопоставлено, поскольку нет перехода для части other из начального состояния.
Единственное отклонение от этого правила заключается в том, что RulePart не является изолирующим по частям, т.е. оно будет соответствовать /. В этом случае RulePart считается конечным и представляет переход, который должен включать все последующие части тестового пути.
© 2007 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/3.0.x/routing/