HTML Diff
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>