Python: Веб-разработка (Flask)
Теория: Обработчики запросов
Одна из содержательных частей цикла запрос-ответ — обработчик запроса. В этом уроке мы разберем, как находить и вызывать обработчика.
Обработчик
Общий принцип работы любого веб-фреймворка отражает архитектуру HTTP. На каждый адрес задается обработчик (handler) — функция, которая выполняет необходимые действия и возвращает ответ.
Обработчики регистрируются с помощью декоратора @route(). Декоратор принимает путь или маршрут, для которого вызовется обработчик:
Каждый путь состоит из сегментов — строк, которые разделены слешами ("/"). Функции index и users в примере — обработчики, а каждое применение декоратора route — добавление нового правила маршрутизации.
Во фреймворках принято определять маршрут как комбинацию метода HTTP и адреса. И это соответствует идеям REST. Flask предлагает два способа указания метода:
- Как аргумент декоратора
route()— все указанные методы будут обрабатываться одной функцией, а выбор метода будет в условиях:
- Как отдельные обработчики под каждый метод с помощью соответствующих декораторов:
get(),post()и других:
Теперь с помощью утилиты curl мы можем выполнить запросы к нашему приложению и проверить, какие сообщения выводятся при GET и POST-запросах:
Диспетчеризация
Процесс поиска нужного обработчика называется диспетчеризацией. Она выполняется в два этапа: до входа во фреймворк и после входа в приложение. Разберем шаги каждого этапа.
До входа в фреймворк:
- Клиент выполняет запрос к веб-серверу, который расположен на сервере. Клиент — это не обязательно браузер, в примере клиент — это программа
curl - Веб-сервер перенаправляет запрос приложению и устанавливает правильные параметры запроса
После входа в приложение — происходит диспетчеризация:
- Фреймворк анализирует параметры запроса и пытается сопоставить маршруты, которые добавлены в объект
appс тем, что пришло. Он сравнивает комбинацию адреса и метода. Если метод не указан в правиле, то по умолчанию предполагается GET. Этот процесс называется роутингом или маршрутизацией. А место, где внутри хранятся все добавленные маршруты, называют роутером - Если в процессе роутинга нашелся соответствующий маршрут, то вызывается его обработчик
- Ответ, который сформировал обработчик, отправляется обратно клиенту
Рассмотрим конкретный пример:
После запуска этого кода формируется роутер, который содержит в себе три маршрута. Посмотреть карту маршрутов можно командой flask routes:
Теперь предположим, что клиент выполнил такой запрос:
После этого последуют следующие действия:
- Веб-сервер вызвал наше приложение
app - Фреймворк сопоставил маршрут
POST /usersи нашел, что за этот запрос отвечает обработчикusers() - Фреймворк вызвал обработчик, который вернул клиенту ответ:
'Hello from POST /users'
Фреймворк может не обнаружить соответствия. Например, если клиент запросит страницу /comments. Тогда фреймворк по умолчанию возьмет управление на себя и автоматически отдаст браузеру ответ 404 — страница не найдена:
Всегда внимательно смотрите, какие делаются запросы и есть ли подходящие под них ответы. Так вам не придется задаваться вопросом, почему браузер ничего не показывает. Проще всего увидеть ответ от сервера через консоль разработчика вашего браузера:
Она есть в каждом браузере. Попробуйте открыть ее и понаблюдать за процессом загрузки.



