Starlette – основа для FastAPI

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Starlette — это легковесный, асинхронный веб-фреймворк, служащий ядром для FastAPI. Несмотря на то что FastAPI известен как один из самых быстрых и современных веб-фреймворков в мире Python, именно Starlette является его фундаментом. Понимание Starlette помогает лучше использовать возможности FastAPI, глубже понимать его архитектуру и эффективно оптимизировать производительность.

Что такое Starlette

История и цели проекта

Starlette был создан Томом Кристенсеном, также известным по проекту Django REST Framework. Основная цель Starlette — предоставить ASGI-совместимую основу для построения высокопроизводительных веб-приложений. Это фреймворк, разработанный с нуля для асинхронной работы, что делает его особенно полезным для современных задач, таких как работа с WebSocket, долгоживущие соединения и масштабируемость.

Основные особенности фреймворка

  • Поддержка ASGI (Asynchronous Server Gateway Interface)

  • Асинхронные обработчики запросов

  • Простая маршрутизация

  • Гибкая система middleware

  • Поддержка WebSocket и фоновых задач

  • Инструменты для тестирования и отладки

Как Starlette связан с FastAPI

Архитектура FastAPI: как он использует Starlette

FastAPI строится поверх Starlette. Он расширяет его, добавляя валидацию данных через Pydantic, автогенерацию OpenAPI-документации, декларативное определение маршрутов и дополнительный синтаксический сахар. Однако все, что касается маршрутизации, обработки запросов, middleware и асинхронности, обрабатывается Starlette.

Почему FastAPI выбрал Starlette как основу

Выбор Starlette объясняется его производительностью, гибкостью и совместимостью с ASGI. Эти качества идеально соответствуют целям FastAPI — быстрому, современному и асинхронному веб-разработчику. Благодаря этому FastAPI может фокусироваться на удобстве разработки, не жертвуя производительностью.

Асинхронность и производительность

Поддержка ASGI и асинхронных вызовов

Starlette полностью совместим с ASGI, новым стандартом интерфейса между веб-серверами и фреймворками, пришедшим на смену WSGI. Это позволяет использовать async def для маршрутов, обеспечивая неблокирующую обработку запросов и высокую параллельность.

Сравнение с WSGI-фреймворками

В отличие от WSGI-фреймворков, таких как Flask или Django, Starlette и FastAPI обрабатывают большое количество соединений одновременно, без блокировки ввода-вывода. Это особенно важно для API, работающих с внешними сервисами, базами данных или микросервисной архитектурой.

Маршрутизация и обработка запросов в Starlette

Как устроена маршрутизация

Starlette использует простой и понятный способ определения маршрутов:

python
from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route async def homepage(request): return JSONResponse({'hello': 'world'}) app = Starlette(debug=True, routes=[ Route("/", homepage), ])

Middleware и события

Starlette предоставляет механизм middleware, который позволяет выполнять код до и после запроса. Также доступны события startup и shutdown для инициализации ресурсов, таких как подключения к БД.

Обработка ошибок и исключений

Встроенные средства обработки

Starlette предоставляет встроенную систему обработки ошибок, включая пользовательские исключения, глобальные перехватчики и форматированные ответы.

Примеры использования

Вы можете настроить собственную страницу ошибки или JSON-ответ для исключения HTTPException, просто передав соответствующую функцию обработчику.

python
from starlette.exceptions import HTTPException from starlette.responses import JSONResponse @app.exception_handler(HTTPException) async def http_exception_handler(request, exc): return JSONResponse({'error': str(exc.detail)}, status_code=exc.status_code)

Функциональные возможности Starlette

Сессии, cookies, заголовки

Starlette поддерживает работу с HTTP-заголовками, cookies, сессиями через middleware. Это позволяет реализовать полноценную авторизацию и хранение состояния пользователя.

WebSocket и фоновые задачи

Фреймворк поддерживает WebSocket-соединения и фоновые задачи (BackgroundTask), что делает его подходящим для чатов, real-time данных и сигнализации.

Тестирование и отладка

Инструменты для разработки и дебага

Starlette поддерживает отладочный режим (debug=True), отображающий подробные трассировки ошибок. Также есть встроенная поддержка взаимодействия с pytest.

Поддержка тестирования

Вы можете использовать TestClient из starlette.testclient для создания юнит-тестов без необходимости запуска сервера.

Безопасность и авторизация

Работа с CORS, HTTPS, заголовками

Starlette предоставляет готовое middleware для обработки CORS, настройки HTTPS и безопасных заголовков.

Интеграция с системами аутентификации

Хотя сам Starlette не содержит встроенной системы аутентификации, он предоставляет достаточно гибкости для интеграции сторонних решений (например, OAuth2 или JWT).

Расширяемость Starlette

Использование сторонних библиотек

Благодаря своей модульной архитектуре, Starlette легко расширяется сторонними пакетами — от баз данных до шаблонизаторов.

Создание собственных middleware

Вы можете создавать собственные middleware, используя простую структуру:

python
class CustomMiddleware: def __init__(self, app): self.app = app async def __call__(self, scope, receive, send): # логика до запроса await self.app(scope, receive, send) # логика после запроса

Сравнение с другими микрофреймворками

Sanic, AIOHTTP, Flask

Starlette по производительности и гибкости превосходит Flask (из-за отсутствия асинхронности), а также опережает AIOHTTP и Sanic по архитектуре и поддержке ASGI.

Преимущества и недостатки Starlette

Преимущества:

  • Высокая производительность

  • Чистая архитектура

  • Полная поддержка асинхронности

Недостатки:

  • Требует более глубокого понимания асинхронности

  • Минимальная встроенная функциональность (но легко расширяется)

Реальные кейсы использования Starlette

Starlette используется в FastAPI, который применяется крупными компаниями, включая Microsoft, Netflix, Uber и другие. Это доказывает его пригодность для масштабных и критически важных систем.

Как начать использовать Starlette

Установка и базовая настройка

bash
pip install starlette

Создание простого приложения занимает менее 10 строк кода.

Простой пример API на чистом Starlette

python
from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route async def hello(request): return JSONResponse({'message': 'Hello, Starlette!'}) app = Starlette(routes=[Route('/hello', hello)])

Starlette в экосистеме Python

Совместимость с другими библиотеками

Starlette прекрасно сочетается с Pydantic, SQLAlchemy, Tortoise ORM, Jinja2 и другими современными библиотеками Python.

Влияние на развитие асинхронных фреймворков

С появлением Starlette многие разработчики перешли на асинхронный стек, и даже старые фреймворки начали добавлять поддержку async/await.

Будущее Starlette и FastAPI

Активность разработки

Проект активно развивается, с регулярными обновлениями и новой документацией.

Планируемые функции и roadmap

В будущем ожидается улучшение поддержки GraphQL, OAuth2, и более глубокая интеграция с FastAPI.

Часто задаваемые вопросы (FAQ)

1. Можно ли использовать Starlette без FastAPI?
Да, Starlette — это самостоятельный фреймворк, и вы можете построить полноценное приложение, используя только его.

2. Чем Starlette отличается от Flask?
Starlette работает асинхронно и быстрее обрабатывает множество запросов одновременно, в отличие от синхронного Flask.

3. Что такое ASGI и зачем он нужен?
ASGI — это интерфейс для асинхронных Python-приложений, обеспечивающий высокую производительность и поддержку WebSocket.

4. Подходит ли Starlette для больших проектов?
Да, особенно в сочетании с FastAPI. Его гибкость и масштабируемость позволяют использовать его в серьёзных системах.

5. Какие библиотеки часто используют вместе со Starlette?
Pydantic, SQLAlchemy, Databases, Tortoise ORM, Jinja2, и Uvicorn как сервер ASGI.

6. Что лучше: писать на Starlette или FastAPI?
Если вам нужно быстрое API с валидацией и документацией — используйте FastAPI. Если вы хотите полный контроль — Starlette.

Полный справочник по ключевым функциям фреймворка Starlette для Python

Установка

bash
pip install starlette

Основные особенности Starlette

Возможность Описание
ASGI-совместимость Асинхронный интерфейс для серверов, таких как uvicorn.
Поддержка WebSocket Нативная.
Middleware Простая настройка промежуточных обработчиков.
Background Tasks Встроенная обработка фоновых задач.
Static & Templates Поддержка статики и шаблонов.
Простое тестирование Совместимость с httpx.
Совместимость с FastAPI Полная (FastAPI построен на Starlette).

Простой пример

python
from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route import uvicorn async def homepage(request): return JSONResponse({'hello': 'world'}) app = Starlette(debug=True, routes=[ Route("/", homepage), ]) if __name__ == "__main__": uvicorn.run(app, host="127.0.0.1", port=8000)

Работа с запросами и ответами

python
from starlette.requests import Request from starlette.responses import HTMLResponse async def echo(request: Request): data = await request.json() return JSONResponse(data)

Типы ответов

Класс Описание
JSONResponse() JSON-ответ.
HTMLResponse() HTML-контент.
PlainTextResponse() Простой текст.
RedirectResponse(url) Редирект.
FileResponse(path) Возвращает файл.
Response(content, media_type) Универсальный ответ.

Подключение маршрутов

python
from starlette.routing import Route routes = [ Route("/", homepage), Route("/echo", echo, methods=["POST"]), ]

Шаблоны (Jinja2)

bash
pip install jinja2
python
from starlette.templating import Jinja2Templates templates = Jinja2Templates(directory='templates') async def hello(request): return templates.TemplateResponse("index.html", {"request": request, "name": "Starlette"})

Статические файлы

python
from starlette.staticfiles import StaticFiles app.mount("/static", StaticFiles(directory="static"), name="static")

WebSocket

python
from starlette.websockets import WebSocket from starlette.routing import WebSocketRoute async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(f"Получено: {data}") app = Starlette(routes=[ WebSocketRoute("/ws", websocket_endpoint) ])

Middleware

python
from starlette.middleware.base import BaseHTTPMiddleware class CustomMiddleware(BaseHTTPMiddleware): async def dispatch(self, request, call_next): response = await call_next(request) response.headers["X-Custom"] = "Value" return response app.add_middleware(CustomMiddleware)

Background Tasks

python
from starlette.background import BackgroundTasks def write_log(message): with open("log.txt", "a") as f: f.write(message + "\n") async def handler(request): tasks = BackgroundTasks() tasks.add_task(write_log, "Запрос получен") return JSONResponse({"status": "ok"}, background=tasks)

Исключения и обработка ошибок

python
from starlette.exceptions import HTTPException from starlette.responses import PlainTextResponse async def not_found(request, exc): return PlainTextResponse("Страница не найдена", status_code=404) app.add_exception_handler(404, not_found)

Тестирование (с httpx)

bash
pip install httpx
python
import httpx async def test_homepage(): async with httpx.AsyncClient(app=app, base_url="http://test") as client: response = await client.get("/") assert response.status_code == 200

Когда использовать Starlette

  • Когда нужно асинхронное API с минимальными зависимостями.

  • Если ты хочешь полный контроль над архитектурой без "магии".

  • При разработке реактивных серверов с WebSocket и SSE.

  • Для высокопроизводительных микросервисов, особенно в связке с uvicorn.

Заключение

Starlette — это не просто "внутренности" FastAPI. Это мощный, современный и высокопроизводительный фреймворк, который стоит изучить каждому разработчику Python. Его архитектура, асинхронность и минимализм делают его идеальным выбором как для микросервисов, так и для больших API-проектов. Понимание Starlette — это шаг к более глубокому и эффективному использованию FastAPI и всей экосистемы Python.