ZANIN блог
Контакты
Крути вниз
Фильтр по:
//Post title

Асинхронный FastAPI - пример создания API

16 Июн 2021Категория : FastAPI

Асинхронный FastAPI - пример создания API

Пример создания небольшого API при помощи асинхронного фреймворка FastAPI. Для этого нам понадобиться создать чистый проект python в PyCharm. Я использую python 3.9.

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

pip install fastapi

pip install uvicorn

pip install SQLAlchemy

pip install PyMySQL

В моей базе MySQL некоторые данные сериализованы в PHP.

pip install phpserialize

Структура проекта будет такой: (может не самая удобная структура, но для того, чтобы попробовать фреймворк, вполне подходит)

FastAPI - создание API

Документация у фреймворка достаточно хорошая, поэтому без очень подробных описаний в файле main.py в корне проекта добавим следующий код.

 



from fastapi import FastAPI, Depends
from crud import *
from database import SessionLocal
from product.product_controller import product_body
from collection.collection_controller import collection_body

app = FastAPI()


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


@app.get("/")
async def root():
    return {"message": "Hello World"}


@app.get("/product/{id}")
async def get_product_by_id(id: int, db: Session = Depends(get_db)):
    product = get_product(db, id=id)
    collection = await get_collection_by_id(product.collection_id, db)
    products = await get_products_collections(product.collection_id, db)
    data = product_body(product, collection, products)

    return data


# 4784
@app.get("/collection/{id}")
async def get_collection_by_id(id: int, db: Session = Depends(get_db)):
    collection = get_collection(db, id=id)
    data = collection_body(collection)

    return data


@app.get("/products-collection/{id}")
async def get_products_collections(id: int, db: Session = Depends(get_db)):
    products = get_products_by_collection(db, collection_id=id)

    return products

FastAPI - создание API

FastAPI - создание API

В файле database.py создаем соединение с базой при помощи SQLALCHEMY

FastAPI - создание API

После этого я создаю директорию models, в которой для каждой модели будет свой файл со своим именем. Возможно, вам привычнее создать файл models.py и в нем писать все модели, как в Django. Но даже в Django, если проект большой, то лучше создавать отдельный файл, под каждую модель в приложении.

FastAPI - создание API

Создаем файлы моделей product.py и collection.py

Файл product.py, в нем мы соединяемся с уже созданной таблицей. На скриншоте подчеркнут красным импорт database - в данном случае IDE Pycharm не понимает, что импорт из родительской директории верный, приложение запускается.

FastAPI - создание API

Файл collection.py

FastAPI - создание API

После этого я создал 2 папки под контроллеры этих моделей, хотя правильнее создать папку controllers, и уже в ней создавать контроллер под каждую модель. Но вы можете сделать структуру, которая удобна вам.

FastAPI - создание API

product_controller.py - тут не создавал класс, просто создал два метода, один из них основной, который формирует общее тело продукта, а второй формирует список словарей, которые содержат товары в коллекции. Также одно поле надо было преобразовать из PHP сериализации. При помощи библиотеки phpserialize можно произвести метод unserialize и получить данные в нормальном виде. Например, Wordpress сериализует некоторые данные и хранит их в базе в виде сериализованных строк.

FastAPI - создание API

collection_controller.py

FastAPI - создание API

После этого создаем файл crud.py в корне проекта, который отвечает за запросы к базе данных.

FastAPI - создание API

Базовое приложение готово. Давайте запустим его. Введите к терминале IDE Pycharm команду на уровне директории, где лежит файл main.py

uvicorm main:app --reload

FastAPI - создание API

После этого можно прейти по адресу http://127.0.0.1:8000/ или уже по готовому эндпоинту с моим id товара и получаем результат.

FastAPI - создание API

Фреймворк очень поход на Flask, но если возможность поставить некоторые методы на выполнение в фоне. К примеру, у вас происходит оформление товара в корзине, но при этом у вас еще должна улететь заявка на почту, заявка в CRM, а после этого только ответ клиенту в корзине. А можно поставить их на выполнение в фоне, это удобная вещь. А так сам фреймворк на скорость на сервере не тестировал.

  • 687

01. Об авторе

Александр Занин

Занимаюсь разработкой на Django,
а также бэкенд разработкой на PHP (Laravel, Slim).

Find on :

02. Свежие статьи

Готовы заказать проект?

© ZANIN 2019 / All rights reserved.
Контакты
Close