Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

HTTP Сессия (запрос и ответ) Python: Веб-разработка (Flask)

Каждая HTTP-сессия определяется двумя вещами — запросом и ответом. Запрос формируется клиентом, например браузером, а ответ — сервером. В этом уроке разберем объекты request и response, которые извлекают данные запроса и формируют ответ. Также покажем способы, с помощью которых из объекта request извлекаются параметры.

Request и response

И запрос и ответ в 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'] – извлекает значение конкретного параметра. Если параметр не найден, то приложение вернет ошибку 400
  • request.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

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


Самостоятельная работа

  1. Измените в example.py следующий обработчик:
 @app.post('/users')
 def users():
     return 'Users', 302
  1. Выполните POST-запрос на него с помощью curl. Убедитесь, что произошел редирект:
# Подставьте ваши параметры
# --head – покажет заголовки
# -X POST – отправит POST запрос
curl --head -X POST localhost:5000/users

Дополнительные материалы

  1. Request
  2. Response

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
с нуля
Разработка веб-приложений на Django
2 февраля 10 месяцев

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»