Каждая HTTP-сессия определяется двумя вещами — запросом и ответом. Запрос формируется клиентом, например браузером, а ответ — сервером. В этом уроке разберем объекты request
и response
, которые извлекают данные запроса и формируют ответ. Также покажем способы, с помощью которых из объекта request
извлекаются параметры.
И запрос и ответ в Flask представлены двумя объектами, обратиться к которым можно внутри каждого обработчика маршрута:
from flask import request
@app.route('/')
def hello_world():
return 'Hello, World!'
Глобальный объект request
используется, чтобы извлекать данные запроса, например, заголовков или содержимого отправленной формы. У запроса нет сеттеров. Его уже выполнили и он не может поменяться:
from flask import request
@app.route('/')
def hello_world():
print(request.headers) # Выводит все заголовки
return 'Hello, World!'
В противоположность этому используется объект response
, чтобы формировать ответ и в процессе работы наполнять данными — заголовками и телом. По умолчанию Flask самостоятельно формирует объект response
, определяет формат возвращаемого контента из обработчика и подставляет нужный формат данных в заголовке:
@app.route('/json/')
def json():
return {'json': 42} # Возвращает тип application/json
@app.route('/html/')
def html():
return render_template('index.html') # Возвращает тип text/html
Если вернуть вместе с телом в виде кортежа-пары еще и число, то клиент получит соответствующий код ответа:
@app.route('/not_found')
def not_found():
return 'Oops!', 404
Обработчики типичных ошибок вроде «Страница не найдена» во Flask выглядят как обработчики запросов. Только разница в том, что обработчики ошибок получают в качестве аргумента объект ошибки. Вот так можно было бы оформить «Страницу 404»:
@app.errorhandler(404)
def not_found(error):
return 'Oops!', 404
Когда нам недостаточно тела и статуса ответа, можно использовать функцию make_response()
. Она принимает то же тело ответа и возвращает объект ответа (flask.Response
). Объект ответа можно модифицировать разными способами и затем вернуть из обработчика:
from flask import make_response
@app.route('/foo')
def foo():
response = make_response('foo')
# Устанавливаем заголовок
response.headers['X-Parachutes'] = 'parachutes are cool'
# Меняем тип ответа
response.mimetype = 'text/plain'
# Задаем статус
response.status_code = 418
# Устанавливаем cookie
response.set_cookie('foo', 'bar')
return response
Параметры запроса — это не часть маршрута и они не влияют на выбор обработчика. Связано это с тем, что такие параметры используются для различных вспомогательных целей. Например, параметр page
, обозначает страницу просматриваемого списка. Обработчик в такой ситуации всегда один и тот же, а данные показываются разные:
curl 'localhost:5000/users?page=4&per=3'
GET /users
Параметры извлекаются из объекта request
несколькими способами:
request.args['name']
– извлекает значение конкретного параметра. Если параметр не найден, то приложение вернет ошибку 400request.args.get(name, default=None)
– извлекает значение конкретного параметра. Если параметр не найден, приложение продолжает работу, а метод вернет default
@app.route('/users/')
def users():
page = request.args.get('page', 1)
per = request.args.get('per', 10)
# Обработка
return response
Количество обработчиков и маршрутов, которые можно добавить, ничем не ограничено. При этом микрофреймворки не задают никакой структуры. Если кода становится много, то разделять его по файлам придется самостоятельно.
@app.post('/users')
def users():
return 'Users', 302
# Подставьте ваши параметры
# --head – покажет заголовки
# -X POST – отправит POST запрос
curl --head -X POST localhost:5000/users
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт