Уроки 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. Надеюсь, это руководство было полезным для вас!
Актуальный хэш коммита для видео ветки main – d51c3625c5d3ebc21eeb5377c36cbff751739329
Репозиторий – https://github.com/luchanos/luchanos_oxford_university
А разве WSGI/ASGI – это не стандартизация интерфейса для взаимодействия нашего приложения с веб-сервером?
Нашел ошибку!
Запустил docker-cont.
Я когда запускаю 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.
Хоспаде… Как же много кода в сравнении с Джанго)) Но будем прорываться через тернии к звездам))
Для ubuntu команда сборки docker-compose будет через пробел. docker compose
sessionmaker необходимо заменить на async_sessionmaker
"передаем параметр созвучный с тем полем которое мы хотим провалидировать" красиво сказано
Офигенно!, пару интересных идей подчерпнул спасибо большое!
Отличная подача материала – постепенное введение в тему и подробное объяснение 👍
Спасибо огромное за качественный контент, очень подробно!
Всем привет, не получается подключиться через Dbeaver у кого то была такая проблема, если да буду рад подсказкам
и непонятно почему в dbeaver порт localhost, если я ставлю такой порт то выходит ошибка, что неверный пароль
спасибо тебе большое, купил курс, который оказался в разы хуже твоего бесплатного. Благо нашел тебя )
У Вас талант в создании презентаций
Что нужно предварительно сделать(либо установить), чтобы команда "% docker-compose -f docker-compose.yaml ud -d" выполнилась? Если это где-то на канале раньше рассматривалось, то скиньте ссылку на видео, пожалуйста.
Почему sessionmaker, а не async_sessionmaker?
Хороший ролик, спасибо!
Очень круто, что код к каждому ролику можно посмотреть.
Обычно либо нет кода вообще, и все по роликам переписываешь, либо есть конечный код всего, в котором без сто грамм не разберёшься.
Огромный респект за такой практический курс.
Топчик!