0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Шаблоны сайта содержат множество внутренних ссылок: от меню до кнопок и форм. До сих пор мы формировали эти ссылки прямо в тех местах, где они нам нужны:</p>
1
<p>Шаблоны сайта содержат множество внутренних ссылок: от меню до кнопок и форм. До сих пор мы формировали эти ссылки прямо в тех местах, где они нам нужны:</p>
2
<p>Так же ссылки строятся и в обработчиках, например, при редиректах:</p>
2
<p>Так же ссылки строятся и в обработчиках, например, при редиректах:</p>
3
<p>В примерах выше формирование ссылки зашито прямо в то место, где она используется. Такой способ формирования ссылок потенциально опасен. Например, маршрут может измениться с /users/{id} на /u/{id}. Тогда придется пройтись по всем шаблонам и изменить все ссылки /users/{{ user['id'] }} на /u/{{ user['id'] }}.</p>
3
<p>В примерах выше формирование ссылки зашито прямо в то место, где она используется. Такой способ формирования ссылок потенциально опасен. Например, маршрут может измениться с /users/{id} на /u/{id}. Тогда придется пройтись по всем шаблонам и изменить все ссылки /users/{{ user['id'] }} на /u/{{ user['id'] }}.</p>
4
<p>Если этот маршрут удалить, сайт и приемочные тесты продолжат работать, но ссылки начнут вести на страницы 404. Будет лучше, если страницы с такими ссылками начнут выдавать ошибки. Тогда выявить подобные ссылки станет крайне просто.</p>
4
<p>Если этот маршрут удалить, сайт и приемочные тесты продолжат работать, но ссылки начнут вести на страницы 404. Будет лучше, если страницы с такими ссылками начнут выдавать ошибки. Тогда выявить подобные ссылки станет крайне просто.</p>
5
<p>Чтобы решить эту задачу, придумали именованные маршруты. Каждому маршруту фреймворка присваивается имя, которое затем можно использовать при построении конкретной ссылки. во Flask в качестве такого имени используется имя обработчика:</p>
5
<p>Чтобы решить эту задачу, придумали именованные маршруты. Каждому маршруту фреймворка присваивается имя, которое затем можно использовать при построении конкретной ссылки. во Flask в качестве такого имени используется имя обработчика:</p>
6
<p>В реальных приложениях ссылки формируются во многих их частях:</p>
6
<p>В реальных приложениях ссылки формируются во многих их частях:</p>
7
<ul><li>В шаблонах</li>
7
<ul><li>В шаблонах</li>
8
<li>В обработчиках (при редиректах)</li>
8
<li>В обработчиках (при редиректах)</li>
9
<li>В письмах</li>
9
<li>В письмах</li>
10
</ul><p>Поэтому большинство фреймворков предоставляют готовую функцию, которую можно использовать везде, где формируются ссылки. В шаблонах Jinja2 ссылки строятся так:</p>
10
</ul><p>Поэтому большинство фреймворков предоставляют готовую функцию, которую можно использовать везде, где формируются ссылки. В шаблонах Jinja2 ссылки строятся так:</p>
11
<p>В качестве первого параметра url_for() передается имя обработчика, а последующими параметрами - необходимые аргументы для функции-обработчика.</p>
11
<p>В качестве первого параметра url_for() передается имя обработчика, а последующими параметрами - необходимые аргументы для функции-обработчика.</p>
12
<p>Так в шаблоне выше url_for('users_show', id=user.id) заменится на конкретную ссылку этого обработчика с подставленными плейсхолдерами. Например для пользователя с user.id равным 42 подставится ссылка /users/42</p>
12
<p>Так в шаблоне выше url_for('users_show', id=user.id) заменится на конкретную ссылку этого обработчика с подставленными плейсхолдерами. Например для пользователя с user.id равным 42 подставится ссылка /users/42</p>
13
<p>Используйте url_for() в шаблонах всегда. Так вы сможете избежать проблемы мертвых ссылок, ситуации, когда url обработчика поменяли в коде, но забыли поменять все старые недействительные ссылки в HTML-страницах.</p>
13
<p>Используйте url_for() в шаблонах всегда. Так вы сможете избежать проблемы мертвых ссылок, ситуации, когда url обработчика поменяли в коде, но забыли поменять все старые недействительные ссылки в HTML-страницах.</p>