Python
October 26

FastAPI для начинающих: простое руководство по созданию быстрых API

FastAPI — это современный фреймворк для создания веб-API на Python, который делает акцент на простоте, скорости и безопасности. Он идеально подходит для тех, кто хочет создать мощное API, минимизируя при этом время разработки. В этой статье мы расскажем о ключевых возможностях FastAPI и разберём основы его использования — от установки до создания простого API.

Что такое FastAPI и почему он популярен?

FastAPI — это веб-фреймворк для Python, созданный Себастьяном Рамирезом. Он был разработан для обеспечения высокой производительности и удобства работы с API.

FastAPI использует асинхронные функции Python и обладает следующими преимуществами:

  • Высокая производительность: FastAPI работает на основе ASGI, что делает его одним из самых быстрых фреймворков на Python.
  • Автоматическая валидация данных: Благодаря интеграции с Pydantic, FastAPI автоматически проверяет входные данные.
  • Поддержка OpenAPI и Swagger: FastAPI автоматически генерирует документацию API, что делает разработку и тестирование проще.
  • Асинхронность: FastAPI поддерживает асинхронные функции, что улучшает производительность и позволяет обрабатывать множество запросов одновременно.

Установка FastAPI

Для начала установим FastAPI и сервер разработки Uvicorn, который нужен для запуска приложений на FastAPI.

pip install fastapi uvicorn

Простейший пример API на FastAPI

Теперь, когда FastAPI установлен, давайте создадим самое простое API-приложение, которое отвечает "Hello, World!" на HTTP-запросы. Сначала создайте файл main.py и добавьте в него следующий код:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

Здесь мы создали приложение FastAPI и добавили один маршрут @app.get("/"), который отвечает JSON-ответом с сообщением "Hello, World!".

Запуск FastAPI приложения

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

uvicorn main:app --reload

Параметр --reload включает автоматическую перезагрузку сервера при изменении кода. Теперь вы можете перейти в браузер по адресу http://127.0.0.1:8000/ и увидеть ответ:

{"message": "Hello, World!"}

Работа с маршрутами (endpoints)

FastAPI позволяет легко создавать маршруты (endpoints) для обработки различных запросов. Например, добавим маршрут для получения данных по ID.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

В этом примере добавлен новый маршрут /items/{item_id}, который принимает параметр item_id и возвращает его. Переход по адресу http://127.0.0.1:8000/items/5 вернёт:

{"item_id": 5}

Использование запросов и параметров

FastAPI также позволяет обрабатывать параметры запросов и передавать данные через query parameters. Например, добавим опциональный параметр name, который будет добавлен в ответ.

from fastapi import FastAPI

app = FastAPI()

@app.get("/greet/")
def greet(name: str = "Guest"):
    return {"greeting": f"Hello, {name}!"}

Теперь, если вы откроете http://127.0.0.1:8000/greet?name=John, то получите ответ:

{"greeting": "Hello, John!"}

А если не укажете name, то по умолчанию будет отображаться "Guest".

Создание POST-запросов

FastAPI позволяет легко создавать маршруты для обработки POST-запросов. Например, создадим API, который принимает данные о пользователе (имя и возраст) и возвращает их обратно в виде JSON.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    name: str
    age: int

@app.post("/user/")
def create_user(user: User):
    return {"message": f"User {user.name} is {user.age} years old"}

Здесь мы определили модель User, которая автоматически валидируется с помощью Pydantic. FastAPI проверяет, что name — это строка, а age — целое число. Теперь, если отправить POST-запрос на http://127.0.0.1:8000/user/ с телом JSON:

{
    "name": "Alice",
    "age": 30
}

ответ будет таким:

{"message": "User Alice is 30 years old"}

Автоматическая документация API

Одним из ключевых преимуществ FastAPI является автоматическая генерация документации API. Перейдите по адресу http://127.0.0.1:8000/docs, и вы увидите интерфейс Swagger с описанием всех доступных маршрутов и примеров запросов. Это позволяет легко тестировать и понимать структуру API без необходимости вручную писать документацию.

Кроме того, по адресу http://127.0.0.1:8000/redoc доступна документация в формате Redoc.

Асинхронные функции в FastAPI

FastAPI позволяет использовать асинхронные функции для повышения производительности при выполнении длительных операций, таких как работа с базами данных или сетевыми запросами.

from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/wait/")
async def wait():
    await asyncio.sleep(2)  # имитация длительной операции
    return {"message": "Waited for 2 seconds"}

Этот маршрут использует асинхронную функцию wait, которая ждёт 2 секунды, а затем возвращает сообщение. Асинхронные функции позволяют обрабатывать несколько запросов одновременно и повышают производительность при больших нагрузках. При этом, остальные запросы также будут выполнены.

Обработка ошибок

FastAPI позволяет легко управлять ошибками с помощью встроенных обработчиков. Например, если параметр запроса не прошёл валидацию, FastAPI автоматически вернёт понятное сообщение об ошибке.

Вы также можете настроить собственные обработчики ошибок:

from fastapi import FastAPI, HTTPException

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id < 0:
        raise HTTPException(status_code=400, detail="Item ID must be positive")
    return {"item_id": item_id}

Здесь, если item_id будет меньше 0, FastAPI вернёт ошибку 400 с сообщением "Item ID must be positive".

Заключение

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

Основные моменты:

  • Установка FastAPI и создание простого API.
  • Обработка GET и POST-запросов.
  • Использование автоматической документации Swagger и Redoc.
  • Валидация данных с помощью Pydantic.
  • Работа с асинхронными функциями для улучшения производительности.

Попробуйте FastAPI в своём проекте, и вы убедитесь, насколько легко можно создать мощное и надёжное API!