Глава 22 · Веб-разработка с Python

HTTP API: обмен данными между программами

Тот же сервер, тот же Flask — но получатель ответа теперь другая программа, а не браузер человека.

До сих пор Flask-приложение отвечало HTML-страницами — их читает человек через браузер. Но у ответа сервера может быть и другой получатель: мобильное приложение, другой сервер или JavaScript-код на той же странице (раздел 22.4 уже показал fetch()). Такой ответ обычно приходит не в виде HTML, а в виде данных — чаще всего JSON.

Программный интерфейс, через который одна программа получает данные от другой, называют API (Application Programming Interface — программный интерфейс приложения). Конкретный адрес внутри API тоже называют эндпоинтом — это более широкое, общеупотребительное значение слова, чем эндпоинт-имя маршрута Flask из раздела 22.11: там речь шла о внутреннем идентификаторе для url_for() , здесь — просто о конкретном URL, который отдаёт данные, а не HTML-страницу.

Обычный маршрутAPI-эндпоинт
Кто читает ответЧеловек через браузерПрограмма: JavaScript, приложение, другой сервер
Формат ответаHTMLЧаще всего JSON
Content-Type ответаtext/htmlapplication/json

Маленький JSON-эндпоинт на Flask

app.py
from flask import jsonify

@app.route("/api/tasks")
def api_tasks():
    return jsonify([{{"id": z["id"], "title": z["title"], "done": z["done"]}} for z in zadachi])

jsonify(...) делает две вещи сразу: превращает данные Python в текст JSON (как json.dumps() из раздела 22.15) и выставляет заголовок ответа Content-Type: application/json, чтобы получатель знал, как читать тело ответа.

Ответ /api/tasks в браузере: массив JSON-объектов с полями done, id и title, кириллица в title показана как экранированные последовательности вида \u0418
Реальный ответ GET /api/tasks итогового проекта. Это валидный JSON — но по умолчанию jsonify() экранирует кириллицу в \uXXXX-последовательности, ровно как описывал раздел 22.15 про json.dumps() без ensure_ascii=False.
REST — распространённый стиль, а не обязательный стандарт
Многие API строят в стиле REST (Representational State Transfer): путь называет ресурс (/api/tasks), а метод определяет действие над ним — GET получает список, POST создаёт новую запись. Это популярное и полезное соглашение, но не единственно возможный способ построить API — важно понимать сам принцип «данные вместо HTML», а не заучивать REST как жёсткое правило.

Раздел 22.35 добавит такой эндпоинт в итоговый проект — GET /api/tasks, возвращающий текущий список задач в формате JSON.

Практика: форматируем данные для API-ответа
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →