Fastapi.FastAPI: примеры (PYTHON)
fastapi.FastAPI(debug: bool=False, **extra: Any): fastapi.FastAPIБазовая информация о функции FastAPI
Функция fastapi.FastAPI является точкой входа для создания веб-приложений на основе фреймворка FastAPI. Её вызывают для инициализации основного объекта приложения, который управляет маршрутизацией, middleware, обработчиками запросов и документацией API.
Использование функции актуально при старте разработки любого API на FastAPI. Созданный экземпляр класса FastAPI используется для декорирования функций-обработчиков маршрутов через методы .get(), .post() и другие, а также для подключения middleware и обработчиков событий.
Аргументы функции
- title (str, по умолчанию: "FastAPI"): Заголовок API, отображается в документации OpenAPI/Swagger и ReDoc.
- description (str, по умолчанию: ""): Подробное описание API, поддерживает Markdown, отображается в документации.
- version (str, по умолчанию: "0.1.0"): Версия API. Обычно следует семантическому версионированию.
- openapi_url (Optional[str], по умолчанию: "/openapi.json"): URL-путь для получения схемы OpenAPI в формате JSON. Установка значения None отключает эту конечную точку.
- openapi_tags (Optional[List[Dict]]): Список словарей с метаданными для тегов (групп маршрутов) в документации.
- servers (Optional[List[Dict]]): Список серверов, где развернут API, используется в схеме OpenAPI.
- terms_of_service (Optional[str]): URL к условиям использования API.
- contact (Optional[Dict]): Контактная информация для API (имя, email, url).
- license_info (Optional[Dict]): Информация о лицензии для API (имя, url).
- debug (bool, по умолчанию: False): Включение режима отладки. При значении True приложение возвращает детальные traceback ошибок.
- docs_url (Optional[str], по умолчанию: "/docs"): URL-путь к интерактивной документации Swagger UI. Установка значения None отключает её.
- redoc_url (Optional[str], по умолчанию: "/redoc"): URL-путь к альтернативной документации ReDoc. Установка значения None отключает её.
- root_path (str): Префикс пути для случаев, когда приложение находится за прокси.
- и другие, менее часто используемые аргументы для тонкой настройки.
Функция возвращает экземпляр класса FastAPI, который является наследником Starlette. Этот объект может быть передан серверу приложений (например, Uvicorn или Hypercorn) для запуска.
Простые примеры использования
Минимальное приложение:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello World"}Запуск через Uvicorn: uvicorn main:app --reload. Результат обращения к GET /:
{"message": "Hello World"}Создание приложения с кастомными настройками:
from fastapi import FastAPI
app = FastAPI(
title="My API",
description="Это мое тестовое API.",
version="1.0.0",
docs_url="/api/docs",
redoc_url=None
)Документация станет доступна по адресу /api/docs, а ReDoc будет отключен.
Похожие фреймворки и функции на Python
В экосистеме Python существуют альтернативные инструменты для создания веб-API.
- Flask (Flask(__name__)): Микрофреймворк, более низкоуровневый. FastAPI построен на Starlette и предоставляет автоматическую валидацию, сериализацию и документацию "из коробки", чего у Flask нет. Flask предпочтителен для очень простых приложений или когда нужен полный контроль над компонентами.
- Django (django.core.wsgi.get_wsgi_application()): Монолитный фреймворк "батарейки включены". Создание API требует дополнительных библиотек (Django REST framework). Выбор падает на Django, если нужна полноценная веб-платформа с ORM, админ-панелью и многими встроенными компонентами. FastAPI легче и быстрее для задач, где требуется только высокопроизводительное API.
- Starlette (starlette.applications.Starlette): Асинхронный фреймворк низкого уровня, на котором построен FastAPI. Непосредственное использование Starlette требует ручной реализации многих функций (валидация, документация), но дает максимальную гибкость.
Аналоги в других языках программирования
- JavaScript/Node.js: Express.js
Аналог создания экземпляра приложения. Express не предоставляет встроенной валидации или автоматической документации, эти функции добавляются middleware.const express = require('express'); const app = express(); app.get('/', (req, res) => res.json({ message: 'Hello' })); app.listen(3000); - Java: Spring Boot (аннотация @SpringBootApplication)
Spring Boot более комплексный и требует компиляции, но предоставляет мощный IoC-контейнер и множество интеграций.@SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @GetMapping("/") public String hello() { return "Hello"; } } - PHP: Laravel (Laravel Lumen)
Lumen - микрофреймворк на основе Laravel, предлагает элегантный синтаксис и множество функций, но работает в синхронном блокирующем режиме по умолчанию.$app = new Laravel\Lumen\Application( dirname(__DIR__) ); $app->router->get('/', function () { return 'Hello'; }); - Golang: net/http или Gin
Gin предоставляет высокую производительность, близкую к FastAPI, но без автоматической генерации схемы OpenAPI по умолчанию.// Gin r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{"message": "hello"}) }) r.Run()
Типичные ошибки
- Неправильный порядок middleware или обработчиков событий (lifespan). Обработчики событий должны быть определены до создания экземпляра приложения, если используется контекстный менеджер.
# Неправильно app = FastAPI() @app.on_event("startup") # Устаревший способ async def startup_event(): print("Starting up")# Правильно (для FastAPI 3.0+ с lifespan) from contextlib import asynccontextmanager from fastapi import FastAPI @asynccontextmanager async def lifespan(app: FastAPI): print("Startup") yield print("Shutdown") app = FastAPI(lifespan=lifespan) # Аргумент передается при создании - Конфликтующие пути для документации. Установка docs_url или openapi_url в значение, которое уже используется другим маршрутом, приводит к перезаписи.
При обращении к GET /api будет вызвана функция my_endpoint, а документация станет недоступна по этому адресу.app = FastAPI(docs_url="/api") @app.get("/api") # Этот маршрут перезапишет документацию! async def my_endpoint(): return {"data": "something"}
Изменения в последних версиях
В FastAPI 0.100.0 и выше устарел декоратор @app.on_event("startup"/"shutdown") в пользу использования параметра lifespan при создании экземпляра приложения. Новый подход более гибкий и соответствует стандарту ASGI.
Интеграция с Pydantic v2, начиная с FastAPI 0.100.0, принесла значительное повышение производительности валидации и сериализации.
Аргумент root_path_in_servers был упразднен, логика автоматического определения root_path из запросов улучшена.
Расширенные примеры
Использование кастомной схемы OpenAPI с тегами и серверами:
from fastapi import FastAPI
app = FastAPI(
title="Advanced API",
openapi_tags=[
{
"name": "items",
"description": "Операции с предметами",
},
{
"name": "users",
"description": "Управление пользователями",
},
],
servers=[
{"url": "https://api.example.com", "description": "Production"},
{"url": "http://localhost:8000", "description": "Development"},
],
terms_of_service="http://example.com/terms/",
contact={
"name": "Support Team",
"email": "support@example.com",
},
license_info={
"name": "MIT",
"url": "https://opensource.org/licenses/MIT",
},
)
@app.get("/items/", tags=["items"])
async def read_items():
return [{"name": "Item 1"}]
@app.post("/users/", tags=["users"])
async def create_user():
return {"status": "created"}Полное отключение документации и схемы OpenAPI:
app = FastAPI(
openapi_url=None,
docs_url=None,
redoc_url=None
)
# Приложение будет обслуживать только пользовательские маршруты.Использование lifespan для управления состоянием приложения (кэш, подключения к БД):
from contextlib import asynccontextmanager
from fastapi import FastAPI
from typing import Dict
# Глобальное состояние (например, кэш в памяти)
app_state: Dict[str, any] = {}
@asynccontextmanager
async def lifespan(app: FastAPI):
# При запуске
app_state["cache"] = {}
app_state["database_ready"] = True
print("Приложение запущено")
yield
# При остановке
app_state.clear()
print("Приложение остановлено")
app = FastAPI(lifespan=lifespan)
@app.get("/state")
async def get_state():
return {"state": app_state}Настройка приложения для работы за прокси (например, Traefik) с использованием root_path:
# Приложение доступно по https://example.com/api/v1
app = FastAPI(root_path="/api/v1")
@app.get("/app")
async def read_main():
return {"message": "Hello World", "root_path": app.root_path}
# Фактический путь к эндпоинту будет /api/v1/app
# В документации пути будут скорректированы.