Ответы сервера

Ответы на запросы.

Сервер призван отвечать на запросы, в этом его суть. Но разные запросы могут ожидать ответа в разных форматах. Кроме того, ответ сервера, будучи правильным HTTP response, должен сообщать статус. Более того, кроме статуса и тела, ответ часто содержит ещё и заголовки, обозначающие тип контента, добавляющие cookies, и тому подобное. К счастью, Flask максимально упрощает работу Web-разработчика и в этом аспекте!

Простейшие виды ответов.

Flask достаточно умён, чтобы догадаться о формате ответа по возвращаемому нами из обработчика значению. Вот три обработчика:

@app.route('/return/text')
def text():
    return "text"

@app.route('/return/json')
def json():
    return {'json': 42}

@app.route('/return/html')
def html():
    return render_template('html.html')

Если вы запустите сервер, содержащий эти обработчики, то при запросе по соответствующим путям, вы получите:

  • text/html в ответ на запросы к /return/text и /return/html
  • application/json в ответ на запрос к /return/json.

Такое поведение можно понять: web-сервер обычно возвращает либо HTML-страницы, либо данные в виде JSON (в ответ на запросы от тех же самых страниц, например). Так строки становятся text/html, а словари — application/json.

Если вы вернёте вместе с телом (в виде кортежа-пары) ещё и число, то клиент получит соответствующий код ответа:

@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

Задание

  1. Добавьте обработчик в ваше приложение (путь выберите сами).
  2. Сделайте так, чтобы обработчик возвращал параметры запроса в виде JSON-объекта. Добейтесь того, чтобы ключи соответствовали именам параметров, а значения — спискам значений для каждого параметра (помним, в запросе параметр может встречаться несколько раз!).

Для полного доступа к курсу, нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

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

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».

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

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

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

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг».