Создайте приложение с помощью FastAPI для Python
Опубликовано: 2022-11-29FastAPI — это быстрая и легкая веб-инфраструктура для создания современных интерфейсов программирования приложений с использованием 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
Чтобы следовать этому руководству и начать работу с 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
Вы протестируете свою установку 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, как показано в шестой строке приведенного выше фрагмента.
Использование подсказок типа
Если вы используете 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
, и вы увидите экран со всеми вашими конечными точками, методами и схемами.
Эта автоматическая документация по API на основе браузера предоставляется FastAPI, и вам не нужно ничего делать, чтобы воспользоваться ею.
Альтернативной документацией по API для браузера, также предоставляемой FastAPI, является Redoc. Чтобы получить доступ к Redoc, перейдите по http://localhost:8000/redoc
, где вам будет представлен список ваших конечных точек, методов и их соответствующих ответов.
Настройка маршрутов в FastAPI
Декоратор @app
позволяет указать метод маршрута, например @app.get
или @app.post
, и поддерживает GET
, POST
, PUT
и DELETE
, а также менее распространенные параметры HEAD
, PATCH
и TRACE
.
Создание вашего приложения с помощью FastAPI
В этом руководстве вы познакомитесь с созданием приложения CRUD с помощью FastAPI. Приложение сможет:
- Создать пользователя
- Чтение записи базы данных пользователя
- Обновите существующего пользователя
- Удалить определенного пользователя
Для выполнения этих операций CRUD вы создадите методы, предоставляющие конечные точки API. Результатом будет база данных в памяти, в которой может храниться список пользователей.
Вы будете использовать библиотеку 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
:
# 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
. Это должно вернуть список всех ваших пользователей, как показано ниже:
На этом этапе ваш файл 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.
Удалить записи базы данных
Поскольку вы создаете приложение 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.
Обновление записей базы данных
Вы собираетесь создать конечную точку для обновления сведений о пользователе. Детали, которые можно обновить, включают следующие параметры: 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
Ниже скриншот теста.
Резюме
Из этого руководства вы узнали о платформе FastAPI для Python и сами увидели, как быстро можно запустить и запустить приложение на основе FastAPI. Вы узнали, как создавать конечные точки API CRUD с помощью фреймворка — создавать, читать, обновлять и удалять записи базы данных.
Теперь, если вы хотите вывести разработку веб-приложений на новый уровень, обязательно ознакомьтесь с платформой Kinsta для хостинга приложений и хостинга баз данных. Как и FastAPI, он чрезвычайно прост.