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

Сервер призван отвечать на запросы, в этом его суть. Но разные запросы могут ожидать ответа в разных форматах. Кроме того, ответ сервера, будучи правильным 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 = 418x
    # устанавливаем cookie
    response.set_cookie('foo', 'bar')
    return response

Задание

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

Хекслет

Подробнее о том, почему наше обучение работает →