Перейти до вмісту

FastAPI

Матеріал з Вікіпедії — вільної енциклопедії.
FastAPI
Image
ТипWeb framework
АвторSebastián Ramírezd Редагувати інформацію у Вікіданих
РозробникСебастіан Рамірез
Перший випуск5 грудня 2018; 7 років тому (2018-12-05)[1]
Стабільний випускreference (P348; тому (P348))
Мова програмуванняPython
ЛіцензіяMIT
Репозиторійgithub.com/tiangolo/fastapi
Вебсайтfastapi.tiangolo.com

FastAPI — це веб-фреймворк для створення API на основі HTTP для Python 3.8+. [2] Він використовує Pydantic та анотування типів для валідації, серіалізації та десеріалізації даних. FastAPI також автоматично генерує документацію OpenAPI для АРІ, створених на ньому[3]. Перший випуск фреймворка відбувся у 2018 році.

Компоненти

[ред. | ред. код]

Pydantic — це бібліотека для валідації даних для Python. Під час написання коду в IDE Pydantic надає підказки щодо типів на основі анотацій[4]. FastAPI широко використовує моделі Pydantic для валідації даних, серіалізації та автоматичного документування API. Ці моделі використовують стандартні анотації типів Python, що забезпечує декларативний спосіб визначення структури та типів даних для вхідних запитів (наприклад, тіл HTTP-запитів) та вихідних відповідей[5].

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool | None = None


@app.post("/items/")
def create_item(item: Item):
    # Обʼєкт 'item' вже провалідований і має правильний тип
    return {"message": "Item received", "item_name": item.name}

Starlette

[ред. | ред. код]

Starlette — це легкий ASGI-фреймворк для підтримки асинхронної функціональності в Python. [6]

Uvicorn — це мінімальний низькорівневий веб/прикланий сервер для асинхронних фреймворків, що реалізує специфікацію ASGI . Технічно він реалізує багатопроцесну модель з одним головним процесом, який відповідає за управління пулом робочих процесів та розподіл вхідних HTTP-запитів до них. Кількість робочих процесів попередньо налаштовується, але кількість процесів можна збільшити або зменшити під час виконання. [7]

Інтеграція з OpenAPI

[ред. | ред. код]

FastAPI автоматично генерує документацію OpenAPI для створених API. Ця документація включає як Swagger UI, так і ReDoc, які надають інтерактивну документацію API. Таку документацію можна використовувати для дослідження та тестування кінцевих точок у режимі реального часу. Це особливо корисно для розробки, тестування та обміну API з іншими розробниками або користувачами. Swagger UI доступний за замовчуванням за маршрутом /docs, а ReDoc – за маршрутом /redoc . [8]

Функції та особливості

[ред. | ред. код]

Асинхронні операції

[ред. | ред. код]

Архітектура FastAPI підтримує асинхронне програмування . Така конструкція дозволяє однопотоковому циклу подій ефективно обробляти велику кількість одночасних запитів, особливо під час роботи з операціями вводу/виводу, такими як запити до бази даних або виклики до зовнішніх служб або API. Для довідки див. шаблон async/await .

Впровадження залежностей

[ред. | ред. код]

FastAPI включає систему впровадження залежностей (DI) для додавання вказівників на сервіси та залежності у код кінцевих точок HTTP. Цей механізм дозволяє розробникам оголошувати такі компоненти, як сеанси бази даних або логіку автентифікації, у вигляді параметрів функцій. FastAPI автоматично додає ці залежності до кожного запиту. [9]

from fastapi import Depends, HTTPException, status
from db import DbSession


# --- Впровадження сесії БД ---
def get_db():
    db = DbSession()
    try:
        yield db
    finally:
        db.close()


@app.post("/items/", status_code=status.HTTP_201_CREATED)
def create_item(name: str, description: str, db: DbSession = Depends(get_db)):
    new_item = Item(name=name, description=description)
    db.add(new_item)
    db.commit()
    db.refresh(new_item)
    return {"message": "Додано успішно!", "item": new_item}


@app.get("/items/{item_id}")
def read_item(item_id: int, db: DbSession = Depends(get_db)):
    item = db.query(Item).filter(Item.id == item_id).first()
    if item is None:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Item not found")
    return item

Підтримка WebSockets

[ред. | ред. код]

Стандарт WebSockets дозволяє дуплексний зв'язок між клієнтом і сервером. Ця можливість є фундаментальною для програм, що потребують безперервного обміну даними, таких як платформи миттєвого обміну повідомленнями, панелі керування даними в реальному часі або багатокористувацькі онлайн-ігри. FastAPI використовує базову реалізацію Starlette, що дозволяє ефективно керувати з'єднаннями та обробкою повідомлень. [10]

# У вас має бути встановлено пакет 'websockets'
from fastapi import WebSocket


@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Текст повідомлення: {data}")

Фонові завдання

[ред. | ред. код]

FastAPI дозволяє виконувати фонові завдання і після того, як клієнту буде надіслано HTTP-відповідь. Це дозволяє API негайно відповідати на запити користувачів, одночасно обробляючи некритичні або трудомісткі операції у фоновому режимі. Типові випадки застосування включають у себе надсилання електронних листів, оновлення кешів або виконання пост-обробки даних. [11]

import time
import shutil
from fastapi import BackgroundTasks, UploadFile, File
from utils import generate_thumbnail


@app.post("/upload-image/")
async def upload_image(
    image: UploadFile = File(...),
    background_tasks: BackgroundTasks
):
    file_location = f"uploaded_images/{image.filename}"
    # Зберігаємо отримане зображення
    with open(image_path, "wb") as f:
        contents = await file.read()
        f.write(contents)

    # Додаємо генерацію мініатюри як фонове завдання
    background_tasks.add_task(generate_thumbnail, file_location, "200x200")

    return {"message": f"Image '{image.filename}' uploaded. Thumbnail generation started in background."}

Приклад

[ред. | ред. код]

Ось простий вебзастосунок, який повертає клієнту текст "Hello, World!" під час відвідування URL:

# Імпортуємо основний клас FastAPIз пакету fastapi
from fastapi import FastAPI

# Створюємо екземпляр класу FastAPI
app = FastAPI()

# Визначаємо маошрут за методом GET для кореневої URL ("/")
@app.get("/")
async def read_root() -> str:
    # Повертаємо текстове повідомлення
    return "Hello, World!"

Див. також

[ред. | ред. код]

Зовнішні посилання

[ред. | ред. код]

Посилання

[ред. | ред. код]
  1. fastapi repo. GitHub. 5 грудня 2018.
  2. FastAPI. fastapi.tiangolo.com. Процитовано 10 квітня 2024.
  3. Lubanovic, Bill (6 листопада 2019). Introducing Python: Modern Computing in Simple Packages (вид. 2nd). O'Reilly Media, Inc. с. 397, 418. ISBN 9781492051367.
  4. Why use Pydantic - Pydantic. docs.pydantic.dev. Процитовано 21 вересня 2023.
  5. Request Body - FastAPI. fastapi.tiangolo.com (англ.). Процитовано 30 червня 2025.
  6. Starlette. www.starlette.io. Процитовано 21 вересня 2023.
  7. Restarting 'uvicorn' Workers with the 'SIGHUP' Signal. bugfactory.io. Процитовано 17 червня 2024.
  8. OpenAPI docs - FastAPI.
  9. Dependencies. Процитовано 30 червня 2025.
  10. WebSockets - FastAPI. fastapi.tiangolo.com (англ.). Процитовано 30 червня 2025.
  11. Background Tasks - FastAPI. fastapi.tiangolo.com (англ.). Процитовано 30 червня 2025.