HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Одна из содержательных частей цикла запрос-ответ - обработчик запроса. В этом уроке мы разберем, как находить и вызывать обработчика.</p>
1 <p>Одна из содержательных частей цикла запрос-ответ - обработчик запроса. В этом уроке мы разберем, как находить и вызывать обработчика.</p>
2 <h2>Обработчик</h2>
2 <h2>Обработчик</h2>
3 <p>Общий принцип работы любого веб-фреймворка отражает архитектуру HTTP. На каждый адрес задается<strong>обработчик (handler)</strong>- функция, которая выполняет необходимые действия и возвращает ответ.</p>
3 <p>Общий принцип работы любого веб-фреймворка отражает архитектуру HTTP. На каждый адрес задается<strong>обработчик (handler)</strong>- функция, которая выполняет необходимые действия и возвращает ответ.</p>
4 <p>Обработчики регистрируются с помощью декоратора @route(). Декоратор принимает путь или маршрут, для которого вызовется обработчик:</p>
4 <p>Обработчики регистрируются с помощью декоратора @route(). Декоратор принимает путь или маршрут, для которого вызовется обработчик:</p>
5 <p>Каждый путь состоит из сегментов - строк, которые разделены слешами ("/"). Функции index и users в примере - обработчики, а каждое применение декоратора route - добавление нового правила маршрутизации.</p>
5 <p>Каждый путь состоит из сегментов - строк, которые разделены слешами ("/"). Функции index и users в примере - обработчики, а каждое применение декоратора route - добавление нового правила маршрутизации.</p>
6 <p>Во фреймворках принято определять маршрут как комбинацию метода HTTP и адреса. И это соответствует идеям<a>REST</a>. Flask предлагает два способа указания метода:</p>
6 <p>Во фреймворках принято определять маршрут как комбинацию метода HTTP и адреса. И это соответствует идеям<a>REST</a>. Flask предлагает два способа указания метода:</p>
7 <ul><li>Как аргумент декоратора route() - все указанные методы будут обрабатываться одной функцией, а выбор метода будет в условиях:</li>
7 <ul><li>Как аргумент декоратора route() - все указанные методы будут обрабатываться одной функцией, а выбор метода будет в условиях:</li>
8 </ul><ul><li>Как отдельные обработчики под каждый метод с помощью соответствующих декораторов: get(), post() и других:</li>
8 </ul><ul><li>Как отдельные обработчики под каждый метод с помощью соответствующих декораторов: get(), post() и других:</li>
9 </ul><p>Теперь с помощью утилиты curl мы можем выполнить запросы к нашему приложению и проверить, какие сообщения выводятся при GET и POST-запросах:</p>
9 </ul><p>Теперь с помощью утилиты curl мы можем выполнить запросы к нашему приложению и проверить, какие сообщения выводятся при GET и POST-запросах:</p>
10 <h2>Диспетчеризация</h2>
10 <h2>Диспетчеризация</h2>
11 <p>Процесс поиска нужного обработчика называется<strong>диспетчеризацией</strong>. Она выполняется в два этапа: до входа во фреймворк и после входа в приложение. Разберем шаги каждого этапа.</p>
11 <p>Процесс поиска нужного обработчика называется<strong>диспетчеризацией</strong>. Она выполняется в два этапа: до входа во фреймворк и после входа в приложение. Разберем шаги каждого этапа.</p>
12 <p>До входа в фреймворк:</p>
12 <p>До входа в фреймворк:</p>
13 <ol><li>Клиент выполняет запрос к веб-серверу, который расположен на сервере. Клиент - это не обязательно браузер, в примере клиент - это программа curl</li>
13 <ol><li>Клиент выполняет запрос к веб-серверу, который расположен на сервере. Клиент - это не обязательно браузер, в примере клиент - это программа curl</li>
14 <li>Веб-сервер перенаправляет запрос приложению и устанавливает правильные параметры запроса</li>
14 <li>Веб-сервер перенаправляет запрос приложению и устанавливает правильные параметры запроса</li>
15 </ol><p>После входа в приложение - происходит диспетчеризация:</p>
15 </ol><p>После входа в приложение - происходит диспетчеризация:</p>
16 <ol><li>Фреймворк анализирует параметры запроса и пытается сопоставить маршруты, которые добавлены в объект app с тем, что пришло. Он сравнивает комбинацию адреса и метода. Если метод не указан в правиле, то по умолчанию предполагается GET. Этот процесс называется<strong>роутингом</strong>или<strong>маршрутизацией</strong>. А место, где внутри хранятся все добавленные маршруты, называют<strong>роутером</strong></li>
16 <ol><li>Фреймворк анализирует параметры запроса и пытается сопоставить маршруты, которые добавлены в объект app с тем, что пришло. Он сравнивает комбинацию адреса и метода. Если метод не указан в правиле, то по умолчанию предполагается GET. Этот процесс называется<strong>роутингом</strong>или<strong>маршрутизацией</strong>. А место, где внутри хранятся все добавленные маршруты, называют<strong>роутером</strong></li>
17 <li>Если в процессе роутинга нашелся соответствующий маршрут, то вызывается его обработчик</li>
17 <li>Если в процессе роутинга нашелся соответствующий маршрут, то вызывается его обработчик</li>
18 <li>Ответ, который сформировал обработчик, отправляется обратно клиенту</li>
18 <li>Ответ, который сформировал обработчик, отправляется обратно клиенту</li>
19 </ol><p>Рассмотрим конкретный пример:</p>
19 </ol><p>Рассмотрим конкретный пример:</p>
20 <p>После запуска этого кода формируется роутер, который содержит в себе три маршрута. Посмотреть карту маршрутов можно командой flask routes:</p>
20 <p>После запуска этого кода формируется роутер, который содержит в себе три маршрута. Посмотреть карту маршрутов можно командой flask routes:</p>
21 <p>Теперь предположим, что клиент выполнил такой запрос:</p>
21 <p>Теперь предположим, что клиент выполнил такой запрос:</p>
22 <p>После этого последуют следующие действия:</p>
22 <p>После этого последуют следующие действия:</p>
23 <ol><li>Веб-сервер вызвал наше приложение app</li>
23 <ol><li>Веб-сервер вызвал наше приложение app</li>
24 <li>Фреймворк сопоставил маршрут POST /users и нашел, что за этот запрос отвечает обработчик users()</li>
24 <li>Фреймворк сопоставил маршрут POST /users и нашел, что за этот запрос отвечает обработчик users()</li>
25 <li>Фреймворк вызвал обработчик, который вернул клиенту ответ: 'Hello from POST /users'</li>
25 <li>Фреймворк вызвал обработчик, который вернул клиенту ответ: 'Hello from POST /users'</li>
26 </ol><p>Фреймворк может не обнаружить соответствия. Например, если клиент запросит страницу<em>/comments</em>. Тогда фреймворк по умолчанию возьмет управление на себя и автоматически отдаст браузеру ответ<em>404</em>- страница не найдена:</p>
26 </ol><p>Фреймворк может не обнаружить соответствия. Например, если клиент запросит страницу<em>/comments</em>. Тогда фреймворк по умолчанию возьмет управление на себя и автоматически отдаст браузеру ответ<em>404</em>- страница не найдена:</p>
27 <p>Всегда внимательно смотрите, какие делаются запросы и есть ли подходящие под них ответы. Так вам не придется задаваться вопросом, почему браузер ничего не показывает. Проще всего увидеть ответ от сервера через консоль разработчика вашего браузера:</p>
27 <p>Всегда внимательно смотрите, какие делаются запросы и есть ли подходящие под них ответы. Так вам не придется задаваться вопросом, почему браузер ничего не показывает. Проще всего увидеть ответ от сервера через консоль разработчика вашего браузера:</p>
28 <p>Она есть в каждом браузере. Попробуйте открыть ее и понаблюдать за процессом загрузки.</p>
28 <p>Она есть в каждом браузере. Попробуйте открыть ее и понаблюдать за процессом загрузки.</p>