Перший старт із FastAPI

Перший старт із FastAPI

  • 15 листопада, 2021
  • читати 10 хв
Валерій Дузь
Валерій Дузь Senior Software Engineer у EPAM, Викладач Комп'ютерної школи Hillel.

У цій статті ми розглянемо перші маленькі кроки у створенні Web API з використанням FastAPI і Postgres.

Ця стаття буде корисна новачкам, які вже знають, як працювати з Flask, але які хотіли б дивитися на щось простіше і сучасніше.

Рекомендуємо публікацію по темі

Підготовка

Давайте створимо папку, в яку помістимо наш проект.

Назвемо директорію user_api і одразу до неї перейдемо.

mkdir user_api
cd user_api

Далі нам потрібно створити віртуальне оточення та встановити необхідні залежності:

  • fastapi
  • fastapi-sqlalchemy
  • pydantic
  • alembic
  • psycopg2
  • uvicorn

Можна це зробити, скориставшись звичайним virtualenv та pip.

virtualenv venv
source venv/bin/activate
pip install astapi fastapi-sqlalchemy pydantic alembic psycopg2-binary uvicorn

Але я б радив використовувати Poetry, про яку я згадував в одній зі своїх статей:

Рекомендуємо публікацію по темі

Перші кроки

Після встановлення залежностей можна починати створювати першу програму на FastAPI.

Створимо простий файл app.py, який помістимо даний шматок коду.

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.post("/student/")
def students():
   return {"status": "success"}


if __name__ == "__main__":
   uvicorn.run(app, host="0.0.0.0", port=8000)

Після чого можна спробувати запустити програму:

uvicorn app:app --reload

--reload потрібен для того, щоб не перезапускати програму після кожної зміни.

Docker

Давайте обернемо наш додаток в Docker, нам буде простіше взаємодіяти з ним і не потрібно буде встановлювати базу даних безпосередньо на комп'ютер.

Dockerfile

FROM python:3.8

WORKDIR /code/

COPY . /code/

# Install dependencies
RUN pip install -r requirements.txt

EXPOSE 8000

docker-compose.yml

version: "3.9"

services:
 db:
   image: postgres:13.3
   ports:
     - "127.0.0.1:5432:5432"
   environment:
     - POSTGRES_PASSWORD=postgres

 api:
   build: .
   env_file: .env
   command: bash -c "alembic upgrade head && uvicorn app:app --reload"
   volumes:
     - .:/code
   ports:
     - "127.0.0.1:8000:8000"
   depends_on:
     - db

.env

DATABASE_URL = postgresql+psycopg2://postgres:postgres@db:5432

Моделі

Для початку роботи з базою даних та створенням таблиць нам потрібно створити моделі та схеми.

Schema

from pydantic import BaseModel


class Student(BaseModel):
   first_name: str
   last_name: str = None
   age: int
   class Config:
       orm_mode = True

Model

model.py

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String


Base = declarative_base()


class Student(Base):
   __tablename__ = "students"
   id = Column(Integer, primary_key=True, index=True)
   first_name = Column(String,)
   last_name = Column(String)
   age = Column(Integer)

Давайте підключимо модель і схему до нашої програми.

import os
import uvicorn
from fastapi import FastAPI


from fastapi_sqlalchemy import DBSessionMiddleware
from fastapi_sqlalchemy import db

from models import Student as StudentModel
from schema import Student as StudentSchema


app = FastAPI()
app.add_middleware(DBSessionMiddleware, db_url=os.environ["DATABASE_URL"])

@app.post("/student/"), response_model=StudentSchema)
def students(student: StudentSchema):


   student_model = StudentModel(
       first_name=student.first_name,
       last_name=student.last_name,
       age=student.age
   )
   
   db.session.add(student_model)
   db.session.commit()

   return student_model


if __name__ == "__main__":
   uvicorn.run(app, host="0.0.0.0", port=8000)

Для того, щоб подивитися схему того, які є таблиці в базі та взагалі дані, я раджу використовувати DBeaver (не реклама, це просто гарний інструмент із безкоштовною версією).

Міграції

Наразі база даних у нас порожня. Слід створити міграції та на основі їх створити таблицю. Для цього використовуватимемо alembic.

Давайте створимо папку з міграціями.

alembic init migration

Тепер ми маємо папку migration, всередині якої в папці versions будуть зберігатися версії наших міграцій. Але для генерації міграцій нам потрібно налаштувати alembic.

Перше — йдемо в alembic.ini і змінюємо значення sqlalchemy.url на порожнє значення, ми його мінятимемо в

sqlalchemy.url =

Далі в папці alembic в env.py замінюємо вміст на

import os, sys

from logging.config import fileConfig

from sqlalchemy import engine_from_config
from sqlalchemy import poolfrom alembic import context


BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
config.set_main_option("sqlalchemy.url", os.environ["DATABASE_URL"])

# Interpret the config file for Python logging.
# This line sets up loggers basically.
fileConfig(config.config_file_name)


import models
target_metadata = models.Base.metadata

Після цього ми можемо створити нашу першу міграцію за допомогою команди:

alembic revision --autogenerate -m "Initial"

Запустимо додаток:

docker-compose up -d

Перевіримо /docs, що все працює і що можливо через сваггер посилати запити і наш додаток відповідає без помилок. Також можна подивитися, чи створилися нові записи в базі даних через DBeaver.

Я сподіваюся, стаття допоможе розробникам-початківцям спробувати новий фреймворк, який може стати гарною заміною Flask.

Рекомендуємо курс по темі