Python: Веб-разработка (Flask)
Теория: HTTP Сессия (запрос и ответ)
Каждая HTTP-сессия определяется двумя вещами — запросом и ответом. Запрос формируется клиентом, например браузером, а ответ — сервером. В этом уроке разберем объекты request и response, которые извлекают данные запроса и формируют ответ. Также покажем способы, с помощью которых из объекта request извлекаются параметры.
Request и response
И запрос и ответ во Flask представлены двумя объектами - request и response, обратиться к которым можно внутри каждого обработчика маршрута:
Глобальный объект request используется, чтобы извлекать данные запроса, например, заголовков или содержимого отправленной формы. request - неизменяемый объект. Запрос уже выполнили со стороны клиента, и он не может поменяться:
Для ответа же используется объект response. По умолчанию Flask самостоятельно формирует объект response и его не нужно передавать явно. Flask сам определяет формат возвращаемого контента из обработчика и подставляет нужный формат данных в заголовке:
Если вернуть вместе с телом в виде кортежа-пары еще и число, то клиент получит соответствующий код ответа:
Разумеется мы не можем перечислить все несуществующие пути, чтобы отдавать по ним коды ошибок. Потому для обработки типичных ошибок вроде «Страница не найдена» во Flask есть особый синтаксис обработчика ошибок. На первый взгляд, обработчик ошибок выглядит как обработчик запросов. Только разница в том, что обработчики ошибок получают в качестве аргумента объект ошибки error. Вот так можно было бы оформить «Страницу 404»:
В большинстве случаев нам достаточно тела ответа и статуса и не нужно явно использовать объект response - Flask самостоятельно оборачивает в него возвращаемые данные. Но если нам надо большее, то нужно использовать функцию make_response(). Она принимает тело ответа и возвращает объект ответа - flask.Response. Объект ответа можно модифицировать разными способами и затем вернуть из обработчика:
В примере выше мы создали объект ответа с телом 'Hello, World!', затем установили в нем наш заголовок, изменили тип ответа, задали куку и статус ответа. Наконец, собранный ответ вернули из обработчика.
Параметры запроса
Параметры запроса, или еще их называют query string — это не часть маршрута и они не влияют на выбор обработчика. Связано это с тем, что такие параметры используются для различных вспомогательных целей. Например, параметр page, обозначает страницу просматриваемого списка. Обработчик в такой ситуации всегда один и тот же, а данные показываются разные:
Параметры извлекаются из объекта запроса. По атрибуту request.args возвращается объект, который похож на словарь, несколькими способами:
request.args– извлекает все параметрыrequest.args.get(name, default=None, type=None)– извлекает значение конкретного параметра в формате строки. Если параметр не найден, приложение продолжает работу, а метод вернетdefault. С помощьюtypeможно привести параметр к определенному типу. Если привести к указанному типу невозможно, возникнет исключениеValueError
Количество обработчиков и маршрутов, которые можно добавить, ничем не ограничено. При этом микрофреймворки не задают никакой структуры. Если кода становится много, то разделять его по файлам придется самостоятельно.

