- Что такое FastAPI
- Какие возможности и зачем нужен
- Как установить FastAPI
- Как запустить FastAPI
- Преимущества FastAPI
- Примеры использования FastAPI
Что такое FastAPI
FastAPI — это современный и высокопроизводительный веб-фреймворк для создания API на языке программирования Python, который был запущен в 2018 году. Он разрабатывался как простой и удобный инструмент для ускорения разработки и уменьшения количества шаблонного кода.
Возможности и назначение
FastAPI позволяет разработчикам создавать быстрые, надежные и масштабируемые API на Python благодаря следующим особенностям:
- эффективному использованию ресурсов за счет применения асинхронных функций;
- валидации данных: дает возможность определить модель данных и установить правила для каждого поля модели, что сократит количество ошибок, облегчит отладку и тестирование;
- встроенным инструментам, позволяющим справляться с увеличивающейся нагрузкой: поддержка горизонтального масштабирования, возможность интеграции с различными сервисами — брокерами сообщений, облачными платформами.
Как установить FastAPI
Установить FastAPI довольно просто — с помощью стандартного менеджера пакетов pip для Python. Итак, для установки в командной строке необходимо ввести следующую команду:
pip install fastapi
После этого фреймворк будет установлен, но для работы с ним также понадобится ASGI-сервер, который поддерживает протокол Asynchronous Server Gateway Interface. Можно использовать Hypercorn или Univern, но здесь будет использоваться последний: он легковесный, и именно его рекомендует использовать документация.
В командной строке нужно ввести команду:
pip install "uvicorn[standard]"
Этого достаточно для того, чтобы запустить фреймворк и начать работу, но иногда могут понадобиться дополнительные библиотеки для Python. Установим их на примере библиотеки SQLAlchemy:
pip install sqlalchemy
Здесь нет ничего сложного или необычного.
Как запустить FastAPI
Перед запуском нужно написать первое приложение, оно будет достаточно простым. Для этого создаем файл main.py и записываем туда следующий код:
# Импортируем класс
from fastapi import FastAPI
# Создаем экземпляр класса
app = FastAPI()
# @app — декоратор, позволяющий определить метод для маршрута, в данном случае это метод GET
# Этот декоратор будет применяться к функции read_root()
# В данном случае декоратор указывает, что функция будет обрабатывать GET-запросы к корневому пути проекта ("/")
# Можно использовать и другие методы: POST, PUT и так далее
@app.get("/")
# Определяем асинхронную функцию read_root(), которая будет возвращать JSON-объект с ключом "message" и значением "Welcome to framework!" — преобразование в JSON-формат осуществит фреймворк
async def read_root():
return {"message": "Welcome to framework!"}
Следует отметить, что называть функции можно как угодно, это лишь пример именования. Также не обязательно использовать асинхронные функции.
Теперь можно осуществить непосредственно запуск приложения, для этого вводим следующую команду:
uvicorn main:app --reload
Здесь запускается сервер uvicorn, где main — это имя файла с приложением, app — переменная с экземпляром класса, --reload включает автоматический перезапуск сервера, если код изменился, что очень удобно для разработки.
Если все работает корректно, то вы получите URL-адрес: обычно это http://127.0.0.1:8000, перейдя по которому можно увидеть JSON-ответ.
Преимущества FastAPI
- Высокая производительность, которая достигается путем использования асинхронных функций — обрабатывается сразу несколько запросов.
- Удобство использования. Синтаксис будет понятен любому программисту, знакомому с Python.
- Автоматическая документация для вашего API: значительно упрощает разработку, тестирование, взаимодействие с клиентами и другими разработчиками. Просмотреть её можно по адресам /docs и /redoc.
- Встроенная с помощью модуля Pydantic валидация, которая позволяет избежать ошибок и писать код более компактно. Объяснение ошибок возвращается в JSON-формате.
- Поддержка популярных библиотек: SQLAlchemy, JWT, pytest и многие другие.
- Поддержка внедрения зависимостей — Dependency Injection. Это означает, что разные классы не будут напрямую зависеть друг от друга, поэтому осуществлять внесение изменений в код, масштабирование и тестирование будет несколько проще.
- Конечно же, активное сообщество тоже является плюсом, ведь это означает, что всегда можно будет получить помощь, обменяться опытом, посмотреть, как другие программисты работают с этим веб-фреймворком.
Примеры использования FastAPI
В качестве первого примера создадим простое приложение, которое будет выполнять роль ежедневника, в котором можно будет создавать задачи и просматривать их:
# Импортируем все необходимое
# BaseModel для создания моделей данных
# List для аннотации типов
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
from datetime import date
app = FastAPI()
# Определяем модель данных: класс Task наследуется от BaseModel и содержит в себе описание задачи — дату, заголовок и описание
class Task(BaseModel):
date: date
title: str
description: str
# Пустой список, куда будут попадать задачи
tasks = []
# Добавляем декоратор, response_model=List[Task] означает, что ответом будет список объектов Task, функция get_tasks() будет возвращать все задачи
@app.get("/tasks", response_model=List[Task])
async def get_tasks():
return tasks
# Здесь будет обрабатываться POST-запрос
@app.post("/tasks", response_model=Task)
async def create_task(task: Task):
tasks.append(task)
return task
Второй пример будет сложнее — напишем приложение для обработки платежей:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
app = FastAPI()
# Определяем модель данных: класс Payment содержит информацию о платеже — сумму, которая больше нуля, валюту и получателя
class Payment(BaseModel):
amount: float = Field(..., gt=0, description="Неверная сумма платежа")
currency: str
recipient: str
# Определяем маршрут с динамическим параметром ({transaction_id}) — это номер транзакции, целое число
# Параметр payment содержит в себе информацию о платеже
# Если сумма платежа меньше нуля — всплывает ошибка 400 (Bad Request)
# Иначе возвращается JSON-ответ с данными о статусе транзакции, ее номере, сумме, валюте и получателе
@app.post("/process_payment/{transaction_id}")
async def process_payment(
transaction_id: int,
payment: Payment
):
if payment.amount <= 0:
raise HTTPException(status_code=400, detail="Неверная сумма платежа")
return {"status": "Транзакция проведена успешно", "transaction_id": transaction_id, "payment": payment}