Маршрутизация 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='', charset=None, strict_slashes=True, merge_slashes=True, redirect_defaults=True, converters=None, sort_parameters=False, sort_key=None, encoding_errors=None, host_matching=False) -
Класс карты хранит все правила URL и некоторые параметры конфигурации. Некоторые значения конфигурации хранятся только в экземпляре
Map, так как они влияют на все правила, другие являются просто значениями по умолчанию и могут быть переопределены для каждого правила. Обратите внимание, что вы должны указать все аргументы, кромеrules, в качестве именованных аргументов!- Параметры:
-
- rules (t.Iterable[RuleFactory] | None) – последовательность правил URL для этой карты.
- default_subdomain (строка) – По умолчанию домен для правил без указанного домена.
-
charset (строка | None) – кодировка символов URL. По умолчанию
"utf-8" - 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. - encoding_errors (строка | None) – метод обработки ошибок при декодировании
-
host_matching (булево значение) – Если установлено в
True, это включает функцию соответствия хосту и отключает функцию соответствия по домену. Если включено, параметрhostк правилам используется вместоsubdomain.
Изменено в версии 2.3: Параметры
charsetиencoding_errorsустарели и будут удалены в Werkzeug 3.0.Журнал изменений
Изменено в версии 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.Если в
match()не передан путь path_info, будет использован путь по умолчанию, переданный в bind. Хотя это не имеет смысла для ручных вызовов bind, это полезно, если вы привязываете карту к среде WSGI, которая уже содержит путь path_info.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, чтобы вам не приходилось передавать информацию о пути в метод match.Изменения
Изменено в версии 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() -
Тип блокировки, который следует использовать при обновлении.
Изменения
Добавлен в версии 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, кодируются по правилам URL с кодировкой символов, определенной в экземпляре 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 (строка) – конечная точка URL-адреса.
- values (Словарь[строка, любой] | None) – значения для построения URL-адреса. Необработанные значения добавляются в URL-адрес в виде параметров запроса.
- method (строка | None) – HTTP-метод для правила, если для одной и той же конечной точки указаны разные URL-адреса для разных методов.
- force_external (булево) – принудительно создавать полные канонические внешние URL-адреса. Если схема URL не указана, это сгенерирует URL-адрес с относительной схемой протокола.
- append_unknown (булево) – неизвестные параметры добавляются к сгенерированному URL-адресу в качестве параметра строки запроса. Отключите эту опцию, если вы хотите, чтобы генератор игнорировал эти параметры.
-
url_scheme (строка | 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[[строка, t.Mapping[строка, t.Any]], WSGIApplication]) – функция, которая вызывается с конечной точкой в качестве первого аргумента и словарем значений как второго. Должна перенаправить на фактическую функцию представления с этой информацией. (см. выше)
- path_info (строка | None) – информация о пути, используемая для сопоставления. Переопределяет информацию о пути, указанную при привязке.
- method (строка | None) – HTTP-метод, используемый для сопоставления. Переопределяет метод, указанный при привязке.
-
catch_http_exceptions (булево) – установите в
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-приложением, которое вы можете вызвать для получения стандартной страницы ошибки 404 (оно оказывается тем же объектом, что и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-запросам.
Журнал изменений
Изменено в версии 2.1: Кодированные по проценту новые строки (
%0a), которые декодируются серверами WSGI, учитываются при маршрутизации вместо преждевременного прекращения соответствия.Добавлен в версии 1.0: Добавлен
websocket.Добавлен в версии 1.0: Добавлен
merge_slashes.Добавлен в версии 0.7: Добавлены
aliasиhost.Изменено в версии 0.6.1:
HEADдобавляется кmethodsеслиGETприсутствует.- Параметры:
-
- 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для переопределения именованных аргументов, предоставляемых новой копии.- Тип возвращаемого значения:
-
Matchers
-
class werkzeug.routing.StateMachineMatcher(merge_slashes) -
- Параметры:
-
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 не имеет дальнейшей поддержки WebSocket за пределами маршрутизации. Эта функция в основном полезна для проектов ASGI.
url_map = Map([
Rule("/ws", endpoint="comm", websocket=True),
])
adapter = map.bind("example.org", "/ws", url_scheme="ws")
assert adapter.match() == ("comm", {})
Если единственным соответствием является правило WebSocket, а привязка — HTTP (или единственным соответствием является HTTP, а привязка — WebSocket), возникает исключение WebsocketMismatch (производное от BadRequest).
Поскольку URL-адреса WebSocket имеют другой протокол, правила всегда создаются со схемой и хостом, force_external=True подразумевается.
url = adapter.build("comm")
assert url == "ws://example.org/ws"
Сопоставление с помощью конечного автомата
По умолчанию алгоритм сопоставления использует конечный автомат, который переходит между частями пути запроса, чтобы найти соответствие. Чтобы понять, как это работает, рассмотрите это правило:
/resource/<id>
Во-первых, это правило разлагается на две RulePart. Первая — это статическая часть со значением resource, вторая — динамическая и требует соответствия регулярному выражению resource.
Затем создаётся конечный автомат с начальным состоянием, которое представляет первую / правила. У этого начального состояния есть одно статическое переключение на следующее состояние, которое представляет вторую / правила. У этого второго состояния есть одно динамическое переключение на конечное состояние, которое включает само правило.
Для сопоставления пути сопоставитель начинает с начального состояния и следует переходам, которые работают. Очевидно, что пробный путь /resource/2 имеет части "", resource и 2, которые соответствуют переходам, и поэтому правило будет соответствовать. В то время как /other/2 не будет соответствовать, так как нет перехода для части other от начального состояния.
Единственное отклонение от этого правила — если RulePart не является изолирующим по частям, то есть он будет соответствовать /. В этом случае RulePart считается конечным и представляет собой переход, который должен включать все последующие части пробного пути.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.3.x/routing/