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>