Python: Веб-разработка (Flask)
2026-02-26 17:11 Diff

Одна из содержательных частей цикла запрос-ответ — обработчик запроса. В этом уроке мы разберем, как находить и вызывать обработчика.

Обработчик

Общий принцип работы любого веб-фреймворка отражает архитектуру HTTP. На каждый адрес задается обработчик (handler) — функция, которая выполняет необходимые действия и возвращает ответ.

Обработчики регистрируются с помощью декоратора @route(). Декоратор принимает путь или маршрут, для которого вызовется обработчик:

Каждый путь состоит из сегментов — строк, которые разделены слешами ("/"). Функции index и users в примере — обработчики, а каждое применение декоратора route — добавление нового правила маршрутизации.

Во фреймворках принято определять маршрут как комбинацию метода HTTP и адреса. И это соответствует идеям REST. Flask предлагает два способа указания метода:

  • Как аргумент декоратора route() — все указанные методы будут обрабатываться одной функцией, а выбор метода будет в условиях:
  • Как отдельные обработчики под каждый метод с помощью соответствующих декораторов: get(), post() и других:

Теперь с помощью утилиты curl мы можем выполнить запросы к нашему приложению и проверить, какие сообщения выводятся при GET и POST-запросах:

Диспетчеризация

Процесс поиска нужного обработчика называется диспетчеризацией. Она выполняется в два этапа: до входа во фреймворк и после входа в приложение. Разберем шаги каждого этапа.

До входа в фреймворк:

  1. Клиент выполняет запрос к веб-серверу, который расположен на сервере. Клиент — это не обязательно браузер, в примере клиент — это программа curl
  2. Веб-сервер перенаправляет запрос приложению и устанавливает правильные параметры запроса

После входа в приложение — происходит диспетчеризация:

  1. Фреймворк анализирует параметры запроса и пытается сопоставить маршруты, которые добавлены в объект app с тем, что пришло. Он сравнивает комбинацию адреса и метода. Если метод не указан в правиле, то по умолчанию предполагается GET. Этот процесс называется роутингом или маршрутизацией. А место, где внутри хранятся все добавленные маршруты, называют роутером
  2. Если в процессе роутинга нашелся соответствующий маршрут, то вызывается его обработчик
  3. Ответ, который сформировал обработчик, отправляется обратно клиенту

Рассмотрим конкретный пример:

После запуска этого кода формируется роутер, который содержит в себе три маршрута. Посмотреть карту маршрутов можно командой flask routes:

Теперь предположим, что клиент выполнил такой запрос:

После этого последуют следующие действия:

  1. Веб-сервер вызвал наше приложение app
  2. Фреймворк сопоставил маршрут POST /users и нашел, что за этот запрос отвечает обработчик users()
  3. Фреймворк вызвал обработчик, который вернул клиенту ответ: 'Hello from POST /users'

Фреймворк может не обнаружить соответствия. Например, если клиент запросит страницу /comments. Тогда фреймворк по умолчанию возьмет управление на себя и автоматически отдаст браузеру ответ 404 — страница не найдена:

Всегда внимательно смотрите, какие делаются запросы и есть ли подходящие под них ответы. Так вам не придется задаваться вопросом, почему браузер ничего не показывает. Проще всего увидеть ответ от сервера через консоль разработчика вашего браузера:

Она есть в каждом браузере. Попробуйте открыть ее и понаблюдать за процессом загрузки.