Учимся использовать FastAPI на примере боевого сервера: от создания пользователя до миграций с Alembic и Async SQLAlchemy

Posted by


Уроки FastAPI на боевом сервере – это отличный способ научиться создавать быстрые и надёжные веб-сервисы на Python с использованием асинхронных технологий. В этом руководстве мы поговорим о создании MVP (Minimum Viable Product) приложения с помощью FastAPI, создании пользователя и использовании миграций с помощью Alembic и Async SQLAlchemy.

FastAPI – это современный фреймворк для создания веб-приложений на Python, который позволяет создавать API быстро и эффективно. Он основан на стандарте OpenAPI (Swagger) и поддерживает асинхронные запросы, что делает его идеальным для создания высокопроизводительных приложений.

Для начала давайте создадим простое приложение с помощью FastAPI. Установим FastAPI и Uvicorn (веб-сервер ASGI) с помощью pip:

pip install fastapi uvicorn

Теперь создадим файл main.py и добавим следующий код:

from fastapi import FastAPI

app = FastAPI()

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

Сохраним файл и запустим сервер с помощью команды:

uvicorn main:app --reload

Теперь мы можем открыть браузер и перейти по адресу http://127.0.0.1:8000/, чтобы увидеть приветственное сообщение "Hello, World!".

Теперь давайте создадим модель пользователя и добавим её в наше приложение. Создадим файл models.py и добавим следующий код:

from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int

Теперь обновим наше приложение main.py, чтобы добавить роут для создания нового пользователя:

from fastapi import FastAPI
from models import User

app = FastAPI()

@app.post("/user")
async def create_user(user: User):
    return {"name": user.name, "age": user.age}

Теперь мы можем создать нового пользователя, отправив POST запрос на http://127.0.0.1:8000/user с данными пользователя в формате JSON.

Теперь давайте добавим поддержку базы данных в наше приложение. Мы будем использовать Async SQLAlchemy для работы с базой данных и Alembic для миграций.

Сначала установим необходимые зависимости:

pip install sqlalchemy asyncpg alembic

Теперь создадим файл database.py и добавим следующий код:

from sqlalchemy import create_engine
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "postgresql+asyncpg://username:password@localhost/db_name"

engine = create_async_engine(DATABASE_URL)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, class_=AsyncSession)

async_session = sessionmaker(autocommit=False, autoflush=False, bind=engine, class_=AsyncSession, expire_on_commit=False)

Замените username, password и db_name на ваши данные для доступа к базе данных.

Теперь давайте создадим миграции с помощью Alembic. Создадим директорию migrations и файл alembic.ini в корне проекта:

alembic init alembic

Отредактируем файл alembic.ini, чтобы указать путь к папке с миграциями и подключение к базе данных:

script_location = alembic
sqlalchemy.url = DATABASE_URL

Теперь создадим первую миграцию:

alembic revision --autogenerate -m "Initial migration"

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

from alembic import op
import sqlalchemy as sa

# This is the generated migration script
def upgrade():
    op.create_table(
        'users',
        sa.Column('id', sa.Integer, primary_key=True),
        sa.Column('name', sa.String),
        sa.Column('age', sa.Integer),
    )

def downgrade():
    op.drop_table('users')

Примените миграцию:

alembic upgrade head

Теперь наше приложение готово к работе с базой данных. Мы можем использовать Async SQLAlchemy для взаимодействия с базой данных в нашем приложении.

Это был длинный и подробный урок о создании приложения с помощью FastAPI, создании пользователя и использовании миграций с помощью Alembic и Async SQLAlchemy. Надеюсь, это руководство было полезным для вас!

0 0 votes
Article Rating
48 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
@luchanos
1 month ago

Актуальный хэш коммита для видео ветки main – d51c3625c5d3ebc21eeb5377c36cbff751739329
Репозиторий – https://github.com/luchanos/luchanos_oxford_university

@evan_kirk
1 month ago

А разве WSGI/ASGI – это не стандартизация интерфейса для взаимодействия нашего приложения с веб-сервером?

@СергейКоваль-ь1в
1 month ago

Нашел ошибку!
Запустил docker-cont.

@СергейКоваль-ь1в
1 month ago

Я когда запускаю docker команду меня выбивает с ошибкой:
(venv) PS C:UsersAcerDesktopОбучение14.08.2024_Boevoi_proect> docker-compose -f docker-compose-local.yaml up -d

validating C:UsersAcerDesktopОбучение14.08.2024_Boevoi_proectdocker-compose-local.yaml: services.db Additional property enviroment is not allowed

NativeCommandExitException: Program "docker-compose.exe" ended with non-zero exit code: 15.

@bernardsoul8936
1 month ago

Хоспаде… Как же много кода в сравнении с Джанго)) Но будем прорываться через тернии к звездам))

@only_prog-mk9tk
1 month ago

Для ubuntu команда сборки docker-compose будет через пробел. docker compose

@vendorkont4141
1 month ago

sessionmaker необходимо заменить на async_sessionmaker

@evgends
1 month ago

"передаем параметр созвучный с тем полем которое мы хотим провалидировать" красиво сказано

@Anshegar
1 month ago

Офигенно!, пару интересных идей подчерпнул спасибо большое!

@alexeydanilov1557
1 month ago

Отличная подача материала – постепенное введение в тему и подробное объяснение 👍

@Tema-z2e
1 month ago

Спасибо огромное за качественный контент, очень подробно!

@zalimonpshigo
1 month ago

Всем привет, не получается подключиться через Dbeaver у кого то была такая проблема, если да буду рад подсказкам

@kanamagg
1 month ago

и непонятно почему в dbeaver порт localhost, если я ставлю такой порт то выходит ошибка, что неверный пароль

@ТимурНиколаев-я8ш
1 month ago

спасибо тебе большое, купил курс, который оказался в разы хуже твоего бесплатного. Благо нашел тебя )

@random_act
1 month ago

У Вас талант в создании презентаций

@ВячаФродо
1 month ago

Что нужно предварительно сделать(либо установить), чтобы команда "% docker-compose -f docker-compose.yaml ud -d" выполнилась? Если это где-то на канале раньше рассматривалось, то скиньте ссылку на видео, пожалуйста.

@666SeeR999
1 month ago

Почему sessionmaker, а не async_sessionmaker?

@takecare-q8b
1 month ago

Хороший ролик, спасибо!

@ВячеславСоколов-у2л
1 month ago

Очень круто, что код к каждому ролику можно посмотреть.
Обычно либо нет кода вообще, и все по роликам переписываешь, либо есть конечный код всего, в котором без сто грамм не разберёшься.
Огромный респект за такой практический курс.

@БлаговестНедков-ж5ы
1 month ago

Топчик!