Создайте приложение с помощью FastAPI для Python

Опубликовано: 2022-11-29

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

Когда вы будете готовы разрабатывать свои собственные приложения FastAPI, вам не придется далеко ходить, чтобы найти место для их размещения. Услуги Kinsta по размещению приложений и размещению баз данных предоставляют платформу как услугу, основанную на Python.

Давайте сначала изучим основы.


Преимущества FastAPI

Ниже приведены некоторые преимущества, которые платформа FastAPI дает проекту.

  • Скорость: как следует из названия, FastAPI — очень быстрый фреймворк. Его скорость сравнима со скоростью Go и Node.js, которые обычно считаются одними из самых быстрых вариантов для создания API.
  • Простота обучения и кода: FastAPI уже придумал почти все, что вам нужно для создания готового к работе API. Как разработчику, использующему FastAPI, вам не нужно писать код с нуля. Всего несколько строк кода, и вы можете получить RESTful API, готовый к развертыванию.
  • Полная документация: FastAPI использует стандарты документации OpenAPI, поэтому документацию можно создавать динамически. Эта документация содержит подробную информацию о конечных точках, ответах, параметрах и кодах возврата FastAPI.
  • API с меньшим количеством ошибок: FastAPI поддерживает пользовательскую проверку данных, что позволяет разработчикам создавать API с меньшим количеством ошибок. Разработчики FastAPI хвастаются тем, что фреймворк приводит к меньшему количеству ошибок, вызванных человеческим фактором — на 40% меньше.
  • Подсказки типов: модуль типов появился в Python 3.5. Это позволяет вам объявить type переменной. Когда тип переменной объявлен, IDE могут обеспечить лучшую поддержку и более точно прогнозировать ошибки.
Рассматриваете FastAPI для своего следующего проекта? Ознакомьтесь с его преимуществами в этом руководстве: Click to Tweet

Как начать работу с FastAPI

Чтобы следовать этому руководству и начать работу с FastAPI, вам сначала нужно сделать несколько вещей.

Убедитесь, что у вас есть текстовый редактор/IDE для программистов, например Visual Studio Code. Другие варианты включают Sublime Text и Espresso.

Распространенной практикой является запуск ваших приложений Python и их экземпляров в виртуальных средах. Виртуальные среды позволяют одновременно запускать разные наборы пакетов и конфигурации и избегать конфликтов из-за несовместимых версий пакетов.

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

 $ python3 -m venv env

Вам также необходимо активировать виртуальную среду. Команда для этого зависит от используемой операционной системы и оболочки. Вот несколько примеров активации CLI для ряда сред:

 # On Unix or MacOS (bash shell): /path/to/venv/bin/activate # On Unix or MacOS (csh shell): /path/to/venv/bin/activate.csh # On Unix or MacOS (fish shell): /path/to/venv/bin/activate.fish # On Windows (command prompt): \path\to\venv\Scripts\activate.bat # On Windows (PowerShell): \path\to\venv\Scripts\Activate.ps1

(Некоторые IDE с поддержкой Python также можно настроить для активации текущей виртуальной среды.)

Теперь установите FastAPI:

 $ pip3 install fastapi

FastAPI — это платформа для создания API, но для тестирования ваших API вам понадобится локальный веб-сервер. Uvicorn — это молниеносный веб-сервер с асинхронным интерфейсом шлюза сервера (ASGI) для Python, который отлично подходит для разработки. Чтобы установить Uvicorn, выполните следующую команду:

 $ pip3 install "uvicorn[standard]"

После успешной установки создайте файл с именем main.py в рабочем каталоге вашего проекта. Этот файл будет вашей точкой входа в приложение.

Макет проекта FastAPI в среде IDE.
Представление базового проекта FastAPI в среде IDE.

Быстрый пример FastAPI

Вы протестируете свою установку FastAPI, быстро настроив пример конечной точки. В файл main.py вставьте следующий код, а затем сохраните файл:

 # main.py from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"greeting":"Hello world"}

Приведенный выше фрагмент кода создает базовую конечную точку FastAPI. Ниже приведено краткое описание того, что делает каждая строка:

  • from fastapi import FastAPI : функциональность вашего API обеспечивается классом FastAPI Python.
  • app = FastAPI() : создает экземпляр FastAPI.
  • @app.get("/") : это декоратор Python, который указывает FastAPI, что функция под ним отвечает за обработку запросов.
  • @app.get("/") : это декоратор, который указывает маршрут. Это создает метод GET на маршруте сайта. Затем результат возвращается обернутой функцией.
  • Другие возможные операции, которые используются для связи, включают @app.post() , @app.put() , @app.delete() , @app.options() , @app.head() , @app.patch() и @app.trace() .

В каталоге файлов выполните следующую команду в своем терминале, чтобы запустить сервер API:

 $ uvicorn main:app --reload

В этой команде main — это имя вашего модуля. Объект app является экземпляром вашего приложения и импортируется на сервер ASGI. Флаг --reload указывает серверу автоматически перезагружаться при внесении любых изменений.

Вы должны увидеть что-то вроде этого в своем терминале:

 $ uvicorn main:app --reload INFO: Will watch for changes in these directories: ['D:\\WEB DEV\\Eunit\\Tests\\fast-api'] INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [26888] using WatchFiles INFO: Started server process [14956] INFO: Waiting for application startup. INFO: Application startup complete.

В браузере перейдите по http://localhost:8000 , чтобы убедиться, что ваш API работает. Вы должны увидеть «Hello»: «World» как объект JSON на странице. Это показывает, как легко создать API с помощью FastAPI. Все, что вам нужно было сделать, это определить маршрут и вернуть словарь Python, как показано в шестой строке приведенного выше фрагмента.

Приложение FastAPI Hello World, работающее в веб-браузере.
Приложение FastAPI Hello World в веб-браузере.

Использование подсказок типа

Если вы используете Python, вы привыкли аннотировать переменные базовыми типами данных, такими как int , str , float и bool . Однако с версии Python 3.9 были введены расширенные структуры данных. Это позволяет вам работать со структурами данных, такими как dictionaries , tuples и lists . С помощью подсказок типа FastAPI вы можете структурировать схему своих данных с помощью моделей pydantic, а затем использовать модели pydantic для ввода подсказок и получения преимуществ от предоставленной проверки данных.

В приведенном ниже примере использование подсказок типов в Python демонстрируется с помощью простого калькулятора стоимости еды, calculate_meal_fee :

 def calculate_meal_fee(beef_price: int, meal_price: int) -> int: total_price: int = beef_price + meal_price return total_price print("Calculated meal fee", calculate_meal_fee(75, 19))

Обратите внимание, что подсказки типов не влияют на работу вашего кода.

Документация по интерактивному API FastAPI

FastAPI использует пользовательский интерфейс Swagger для предоставления автоматической интерактивной документации по API. Чтобы получить к нему доступ, перейдите по http://localhost:8000/docs , и вы увидите экран со всеми вашими конечными точками, методами и схемами.

Снимок экрана пользовательского интерфейса Swagger для документации.
Документация пользовательского интерфейса Swagger для FastAPI.

Эта автоматическая документация по API на основе браузера предоставляется FastAPI, и вам не нужно ничего делать, чтобы воспользоваться ею.

Альтернативной документацией по API для браузера, также предоставляемой FastAPI, является Redoc. Чтобы получить доступ к Redoc, перейдите по http://localhost:8000/redoc , где вам будет представлен список ваших конечных точек, методов и их соответствующих ответов.

Скриншот интерфейса Redoc для документации.
Документация Redoc для FastAPI.

Настройка маршрутов в FastAPI

Декоратор @app позволяет указать метод маршрута, например @app.get или @app.post , и поддерживает GET , POST , PUT и DELETE , а также менее распространенные параметры HEAD , PATCH и TRACE .

Создание вашего приложения с помощью FastAPI

В этом руководстве вы познакомитесь с созданием приложения CRUD с помощью FastAPI. Приложение сможет:

  • Создать пользователя
  • Чтение записи базы данных пользователя
  • Обновите существующего пользователя
  • Удалить определенного пользователя

Для выполнения этих операций CRUD вы создадите методы, предоставляющие конечные точки API. Результатом будет база данных в памяти, в которой может храниться список пользователей.

Схема структуры таблицы базы данных для примеров CRUD.
Структура таблицы базы данных для примеров CRUD.

Вы будете использовать библиотеку pydantic для проверки данных и управления настройками с помощью аннотаций типов Python. Для целей этого руководства вы объявите форму ваших данных как классы с атрибутами.

В этом руководстве будет использоваться база данных в памяти. Это нужно для того, чтобы вы быстро начали использовать FastAPI для создания своих API. Однако для производства вы можете использовать любую базу данных по вашему выбору, например, PostgreSQL, MySQL, SQLite или даже Oracle.

Создание приложения

Вы начнете с создания модели пользователя. Пользовательская модель будет иметь следующие атрибуты:

  • id : универсальный уникальный идентификатор (UUID)
  • first_name : Имя пользователя
  • last_name : Фамилия пользователя
  • gender : пол пользователя
  • roles , который представляет собой список, содержащий роли admin и user .

Начните с создания нового файла с именем models.py в вашем рабочем каталоге, затем вставьте следующий код в models.py , чтобы создать модель:

 # models.py from typing import List, Optional from uuid import UUID, uuid4 from pydantic import BaseModel from enum import Enum from pydantic import BaseModel class Gender(str, Enum): male = "male" female = "female" class Role(str, Enum): admin = "admin" user = "user" class User(BaseModel): id: Optional[UUID] = uuid4() first_name: str last_name: str gender: Gender roles: List[Role]

В приведенном выше коде:

  • Ваш класс User расширяет BaseModel , который затем импортируется из pydantic .
  • Вы определили атрибуты пользователя, как обсуждалось выше.

Следующим шагом будет создание вашей базы данных. Замените содержимое файла main.py следующим кодом:

 # main.py from typing import List from uuid import uuid4 from fastapi import FastAPI from models import Gender, Role, User app = FastAPI() db: List[User] = [ User( id=uuid4(), first_name="John", last_name="Doe", gender=Gender.male, roles=[Role.user], ), User( id=uuid4(), first_name="Jane", last_name="Doe", gender=Gender.female, roles=[Role.user], ), User( id=uuid4(), first_name="James", last_name="Gabriel", gender=Gender.male, roles=[Role.user], ), User( id=uuid4(), first_name="Eunit", last_name="Eunit", gender=Gender.male, roles=[Role.admin, Role.user], ), ]

В main.py :

  • Вы инициализировали db с типом List и передали модель User
  • Вы создали базу данных в памяти с четырьмя пользователями, у каждого из которых есть необходимые атрибуты, такие как first_name , last_name , gender и roles . Пользователю Eunit назначаются роли admin и user , а остальным трем пользователям назначается только роль user .

Чтение записей базы данных

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

В файле main.py вставьте следующий код чуть ниже конечной точки Hello World :

Боретесь с простоями и проблемами WordPress? Kinsta — это решение для хостинга, предназначенное для экономии вашего времени! Ознакомьтесь с нашими возможностями
 # main.py @app.get("/api/v1/users") async def get_users(): return db

Этот код определяет конечную точку /api/v1/users и создает асинхронную функцию get_users , которая возвращает все содержимое базы данных db .

Сохраните файл, и вы сможете протестировать конечную точку пользователя. Выполните следующую команду в своем терминале, чтобы запустить сервер API:

 $ uvicorn main:app --reload

В браузере перейдите по http://localhost:8000/api/v1/users . Это должно вернуть список всех ваших пользователей, как показано ниже:

Скриншот пользовательских данных, возвращенных запросом FastAPI GET.
Пользовательские данные, полученные запросом на чтение базы данных FastAPI.

На этом этапе ваш файл main.py будет выглядеть так:

 # main.py from typing import List from uuid import uuid4 from fastapi import FastAPI from models import Gender, Role, User app = FastAPI() db: List[User] = [ User( id=uuid4(), first_name="John", last_name="Doe", gender=Gender.male, roles=[Role.user], ), User( id=uuid4(), first_name="Jane", last_name="Doe", gender=Gender.female, roles=[Role.user], ), User( id=uuid4(), first_name="James", last_name="Gabriel", gender=Gender.male, roles=[Role.user], ), User( id=uuid4(), first_name="Eunit", last_name="Eunit", gender=Gender.male, roles=[Role.admin, Role.user], ), ] @app.get("/") async def root(): return {"Hello": "World",} @app.get("/api/v1/users") async def get_users(): return db

Создание записей базы данных

Следующим шагом является создание конечной точки для создания нового пользователя в вашей базе данных. Вставьте следующий фрагмент в файл main.py :

 # main.py @app.post("/api/v1/users") async def create_user(user: User): db.append(user) return {"id": user.id}

В этом фрагменте вы определили конечную точку для отправки нового пользователя и использовали декоратор @app.post для создания метода POST .

Вы также создали функцию create_user , которая принимает user модели User , и добавили (добавили) только что созданного user в базу данных db . Наконец, конечная точка возвращает объект JSON вновь созданного id пользователя.

Вам нужно будет использовать автоматическую документацию по API, предоставленную FastAPI, для тестирования вашей конечной точки, как показано выше. Это связано с тем, что вы не можете сделать почтовый запрос с помощью веб-браузера. Перейдите по http://localhost:8000/docs для тестирования с использованием документации, предоставленной SwaggerUI.

Снимок экрана, показывающий параметры запроса FastAPI POST.
Параметры запроса FastAPI POST.

Удалить записи базы данных

Поскольку вы создаете приложение CRUD, ваше приложение должно иметь возможность удалять указанный ресурс. В этом руководстве вы создадите конечную точку для удаления пользователя.

Вставьте следующий код в файл main.py :

 # main.py from uuid import UUID from fastapi HTTPException @app.delete("/api/v1/users/{id}") async def delete_user(id: UUID): for user in db: if user.id == id: db.remove(user) return raise HTTPException( status_code=404, detail=f"Delete user failed, id {id} not found." )

Вот построчная разбивка того, как работает этот код:

  • @app.delete("/api/v1/users/{id}") : вы создали конечную точку удаления с помощью декоратора @app.delete() . Путь по-прежнему /api/v1/users/{id} , но затем он извлекает id , который является переменной пути, соответствующей идентификатору пользователя.
  • async def delete_user(id: UUID): : Создает функцию delete_user , которая извлекает id из URL-адреса.
  • for user in db: : Это говорит приложению перебирать пользователей в базе данных и проверять, совпадает ли переданный id с пользователем в базе данных.
  • db.remove(user) : если id соответствует пользователю, пользователь будет удален; в противном случае будет HTTPException с кодом состояния 404.
Снимок экрана, показывающий параметры запроса FastAPI DELETE.
Параметры запроса FastAPI DELETE.

Обновление записей базы данных

Вы собираетесь создать конечную точку для обновления сведений о пользователе. Детали, которые можно обновить, включают следующие параметры: first_name , last_name и roles .

В файле models.py вставьте следующий код под своей моделью User , то есть после класса User(BaseModel): :

 # models.py class UpdateUser(BaseModel): first_name: Optional[str] last_name: Optional[str] roles: Optional[List[Role]]

В этом фрагменте класс UpdateUser расширяет BaseModel . Затем вы устанавливаете обновляемые пользовательские параметры, такие как first_name , last_name и roles , как необязательные.

Теперь вы создадите конечную точку для обновления сведений о конкретном пользователе. В файле main.py вставьте следующий код после декоратора @app.delete :

 # main.py @app.put("/api/v1/users/{id}") async def update_user(user_update: UpdateUser, id: UUID): for user in db: if user.id == id: if user_update.first_name is not None: user.first_name = user_update.first_name if user_update.last_name is not None: user.last_name = user_update.last_name if user_update.roles is not None: user.roles = user_update.roles return user.id raise HTTPException(status_code=404, detail=f"Could not find user with id: {id}")

В приведенном выше коде вы сделали следующее:

  • Создал @app.put("/api/v1/users/{id}") , конечную точку обновления. Он имеет переменный параметр id , который соответствует id пользователя.
  • Создан метод с именем update_user , который принимает класс UpdateUser и его id .
  • Использовал цикл for , чтобы проверить, находится ли пользователь, связанный с переданным id , в базе данных.
  • Проверяется, если какой-либо из параметров пользователя не is not None (не null). Если какой-либо параметр, например first_name , last_name или roles , не равен null, он обновляется.
  • Если операция выполнена успешно, возвращается идентификатор пользователя.
  • Если пользователь не был обнаружен, возникает исключение HTTPException с кодом состояния 404 и сообщением Could not find user with id: {id} .

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

 uvicorn main:app --reload

Ниже скриншот теста.

Снимок экрана, показывающий параметры для запроса UPDATE.
Параметры запроса FastAPI UPDATE.

Узнайте, как FastAPI может снизить число ошибок, вызванных деятельностью человека, на 40 процентов. Начните прямо здесь: Нажмите, чтобы написать в Твиттере

Резюме

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

Теперь, если вы хотите вывести разработку веб-приложений на новый уровень, обязательно ознакомьтесь с платформой Kinsta для хостинга приложений и хостинга баз данных. Как и FastAPI, он чрезвычайно прост.