Мы рассказывали про Django — популярный фреймворк, на котором написано множество современных веб-приложений, в том числе YouTube, Dropbox и Reddit. Сегодня расскажем про ещё один фреймворк, популярность которого почти сравнялась с Django, — FastAPI.
Для начала — немного теории
Мы будем говорить о фреймворках для веб-приложений, поэтому кратко вспомним все основные понятия.
Веб-приложения (веб-сервисы) — программы, которые работают через браузер: поиск Яндекса, Google-карты, онлайн-сервисы конвертации файлов. Веб-сервисы отправляют запрос на сервер, там они с ними что-то делают, а потом в виде веб-страницы возвращают результат.
Фреймворки и библиотеки — наборы готовых решений для кода.
Фреймворки позволяют быстро создавать большие программы и сервисы, работа с ними идёт гораздо быстрее. Но написать что-то специфическое сложно, потому что нужно пользоваться тем, что придумали за вас. Это как конструктор сайтов, когда есть несколько вариантов блока с картинкой и можно использовать только их.
Библиотеки тоже добавляют готовые шаблоны кода, но менее масштабные. С библиотеками проще написать что-то своё. Это уже как кирпичики, из которых можно построить как новый фреймворк, так и использовать для создания чего-то нестандартного и нового.
API — это способ связи одной программы с другими. Если API есть, к сервису или приложению может прийти другая программа и попросить что-то сделать. Ещё API полезен потому, что без него сложно масштабировать проект.
Допустим, вы написали веб-приложение, оно стало популярным, и вы решили сделать ещё мобильное и десктопное приложения. Без API придётся писать дополнительно две независимые кодовые базы, которые между собой никак не связаны. Каждую из них нужно отдельно развивать и поддерживать. Но можно по-другому: сразу написать API и строить всё вокруг него. В основе будет лежать вся логика бэкенда: запросы в базы данных, обработка действий пользователя и всё остальное, что понадобится. И при этом в программе будут ручки (API), за которые этот бэкенд будет дёргать любое другое приложение: веб, мобильное, десктопное. Можно прикрутить даже девайс от умного дома, если нужно.
Асинхронные задачи или функции выполняются так, что для начала одной задачи не нужно ждать окончания другой. Это особенно важно в веб-разработке, потому что если приложение будет работать с каждым пользователем по очереди, то для просмотра ролика на YouTube пришлось бы ждать несколько месяцев.
Что такое FastAPI
FastAPI — это инструмент, который позволяет создавать API для нашего сервера с помощью Python. Или вообще написать полноценный сервер, завязанный чисто на API, который будет управлять всей логикой работы, — тут всё зависит от задач и масштабов.
Ещё FastAPI может работать с фронтендом — давать ему нужные данные и даже шаблоны страниц для быстрой отправки и отображения на устройстве.
Получается, что всё, что написано на FastAPI, соединяет нескольких участников нашего веб-приложения:
- Базу данных, где хранятся данные о пользователях, запусках, ошибках и других вещах. Баз может быть несколько и со всеми можно работать одновременно.
- Внешние API других программ, которые могут что-то запросить у нашего приложения по интернету, например внешнее приложение спросит погоду и покажет её в своём приложении.
- Кодовую база нашего бэкенда (возможно, полностью написанную с помощью FastAPI).
- Веб-сервер, который часто используется в том числе для масштабирования и выравнивания нагрузки от пользователей.
- Фронтенд — веб-страницу, через которую можно работать с приложением.
👉 FastAPI — центр работающего веб-приложения. Он соединяет базу данных, другие API и видимую часть нашего сервиса.
Как работает FastAPI
С технической стороны про FastAPI стоит сказать три вещи: он асинхронный, для него нужен сервер, всё основано на библиотеке Pydantic
. Разберём всё по порядку.
Для асинхронности в Python есть библиотека asyncio
. С ней можно писать функции, которые будут переключаться между задачами и выполнять их асинхронно, чтобы, например, запрос от одного пользователя не останавливал обработку запроса от другого. FastAPI уже знает всё про asyncio
и использует её возможности в своих конструкциях (справедливости ради, нужно сказать, что не получится использовать FastAPI и не использовать асинхронный код).
Самое простое веб-приложение на FastAPI выглядит так:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def the_code_method():
return {"message": "Привет, Код!"}
Для веб-приложения понадобится сервер. В FastAPI обычно используют uvicorn — это асинхронный веб-сервер для Python.
Асинхронные Python-серверы работают по стандарту ASGI (Asynchronous Server Gateway Interface). Они переключаются между запросами от пользователей и работают с несколькими задачами одновременно.
В Django и Flask используются синхронные Python-серверы по стандарту WSGI (Web Server Gateway Interface), и они могут обрабатывать запросы только по очереди. Для ускорения работы в таких системах создают несколько параллельных потоков обработки запросов. Но количество потоков ограничено и зависит от количества ядер процессора.
WSGI необязательно хуже ASGI. Даже с ограничениями синхронности серверы YouTube или Pinterest успешно работают с миллионами пользователей каждый день.Так выглядит запуск сервера uvicorn — после этого он становится доступен на компьютере по стандартному адресу 127.0.0.1:8000:
В FastAPI встроена почти вся функциональность библиотеки Pydantic для анализа и проверки данных. С ней можно задавать свои правила для проверки или использовать существующие.
Например, мы можем указать, как следует заполнять форму регистрации. Для этого добавляем стандартный класс BaseModel
библиотеки и вписываем всё что нужно:
from pydantic import BaseModel
# создаём пользователя
class User(BaseModel):
# и указываем свои правила:
# имя должно быть строкой
username: str
# возраст должен быть целым числом и не меньше 18
age: conint(gt=18)
# устанавливаем формат для электронной почты
email: EmailStr
# пароль должен быть строкой от 8 до 16 символов
password: constr(min_length=8, max_length=16)
# телефон должен быть строкой — это необязательное поле
phone: Optional[str] = 'Unknown'
Мы привели пример для проверки пользователя, но проверка данных внутри FastAPI будет работать везде: настройки сервера, базы данных, API.
Pydantic — одна из Python-библиотек, которые написаны на других языках для большей скорости работы (в нашем случае — на Rust). А ещё она полностью покрыта автотестами, поэтому почти на 100% защищена от внутренних ошибок.
Плюсы FastAPI
Это самый быстрый из современных популярных фреймворков для веб-разработки. Два других в тройке — Flask и Django. Это потому, что FastAPI асинхронный, а остальные — синхронные. Django и Flask при умелом обращении тоже справляются с нагрузкой, но до родной скорости FastAPI им далеко.
Также FastAPI просто освоить. Если вы уже знаете Python, то за неделю можно разобраться и написать свой бэкенд для веб-сервисов среднего уровня. С Django придётся осваиваться подольше, а Flask хоть и самый простой, но проигрывает по скорости и возможностям.
А ещё, пока вы пишете код с FastAPI, автоматически создаётся API-документация. Её можно посмотреть, зайдя по адресу 127.0.0.1:8000/docs или 127.0.0.1:8000/redoc. Адресов два, потому что документация создаётся сразу в двух сервисах: Swagger и Redoc. Выглядит это так:
Автоматическая проверка данных через Pydantic и автоматическая документация — два серьёзных плюса при масштабировании проекта. Они сокращают непредвиденные ошибки и делают код понятнее, что сильно сэкономит время и силы.
Пока что самым популярным фреймворком в этой области считается Django, но FastAPI с ним почти сравнялся. Это не значит, что надо бросать учить Django или ставить на нём крест — просто теперь на работе бэкенд-разработчиком знание FastAPI пригодится вам с большей вероятностью. А по-хорошему надо знать оба.
Ещё FastAPI не так сильно ограничивает пользователя своими правилами, как это делают фреймворки со строгой экосистемой. Можно создавать свою архитектуру, работу с базами данных и структуру файлов и папок. А если через несколько лет появится новый фреймворк, переехать на него будет проще, потому что FastAPI не так сильно привязывает к себе, как Django.
Если он такой хороший, то почему YouTube и Mozilla до сих пор на Django?
Потому что легаси.
FastAPI появился в 2018 году, а Django — в 2005-м. Django — хорошая, стабильная, проверенная временем технология, для которой написано много таких же проверенных дополнений и расширений. У каждого из фреймворков есть то, чего нет у другого.
Ключевое преимущество FastAPI для крупных компаний в том, что он быстрее. Но за много лет работы с Django разработчики научились достигать хороших результатов в скорости и на синхронном фреймворке.
Переезд на другую технологию — это всегда трудоёмкий и затратный процесс, даже для небольших сервисов. А для таких гигантов как YouTube или Google это будет стоить ещё дороже. Если текущий фреймворк удовлетворяет все потребности, зачем тратить деньги?
Ещё крупные сервисы связаны с другими сервисами, которые работают с ними по API. Переписываешь свой продукт — остальным тоже придётся вносить изменения.
Когда стоит взять что-то другое
Если нужно быстро написать небольшое веб-приложение с минимумом функций и небольшой нагрузкой, лучше использовать другой фреймворк — Flask. Он простой и проверенный временем, и из всех современных фреймворков для веб-приложений изучить его проще всего. Для простых проектов — самое то.
Для создания чего-то по-настоящему сложного (когда уже на старте понимаешь, что это будет огромный монстр-комбайн или суперапп) лучше взять Django. У него огромное количество встроенных функций и потенциальных возможностей, которые могут пригодиться. Для хорошей скорости придётся поработать и почитать весь интернет, но достичь её возможно.
Что написано на FastAPI
Хотя полностью сменять одну технологию на другую дорого и долго, что-то новое можно внедрять постепенно. Из известных компаний FastAPI используют:
- Microsoft,
- Apple,
- IBM,
- Siemens,
- Uber,
- Netflix.
Всех, кто использует FastAPI, можно посмотреть на странице app.theirstack.com:
Как научиться
Тем, кто уже что-то программирует на Python и понимает основные принципы асинхронного программирования, будет несложно. Если пока не знаете Python, то лучше начать с него.
Если хотите изучить всё подробно, посмотрите документацию FastAPI на официальном сайте. Часть доступна на русском языке.Тем, кто хочет сразу попробовать что-то написать, можно посмотреть видеотуториалы (осторожно, Ютуб).