У цій статті ми розглянемо перші маленькі кроки у створенні 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.