روز 46-47: سری FastAPI مبتدی – قسمت 3

در این پست، ما به جزئیات بیشتر FastAPI می پردازیم که شنیده ام برای ساخت API در پایتون عالی است. ما یک API ساده و سرراست ایجاد خواهیم کرد، با استفاده از یک “Person” به عنوان مدل خود با سه ویژگی: first_name، last_name، و active. هدف درک و به کارگیری تکنیک ها و مفاهیمی است که در چند روز گذشته در مورد آنها مطالعه کرده ام.
در قسمت 2 نحوه کار مسیرها را نشان دادیم. این بار ما در واقع با یک مدل Person کار می کنیم و عملکردی برای ماندگاری و بازیابی داده ها از یک پایگاه داده ایجاد می کنیم. برای این تمرین، SQLite را به دلیل سبک وزن و ویژگیهای مبتنی بر دیسک انتخاب کردم. SqlLite ظاهرا پر استفاده ترین موتور پایگاه داده در جهان است زیرا در بسیاری از تلفن های همراه تعبیه شده است و در بسیاری از برنامه های روزانه نیز استفاده می شود.
در یک یادداشت جانبی، من ممکن است برخی از پست های آینده مربوط به PostgreSQL و حتی MySQL داشته باشم، زیرا، چرا که نه؟ به نظر می رسد یک تمرین است. اما به هر حال SQLite را بررسی کنید [here] https://www.sqlitetutorial.net/).
ابزار ما که قرار است برای ارتباط با پایگاه داده SQLite استفاده کنیم، SQLAlchemy است، یک جعبه ابزار SQL که یک API یکپارچه برای پایگاه داده های رابطه ای مختلف ارائه می دهد. اگر FastAPI را با pip install "fastapi[all]"
، SQLAlchemy در حال حاضر بخشی از راه اندازی شما است. اما اگر FastAPI را به تنهایی انتخاب کردید، باید SQLAlchemy را جداگانه نصب کنید pip install sqlalchemy
.
من فقط به نکات قابل توجه کد اشاره می کنم. کد کامل در یک مخزن Github واقع در اینجا خواهد بود: https://github.com/jenad88/enad-project-1
یک فایل db.py وجود دارد که حاوی کدی است که از SQLAlchemy استفاده می کند که یک جعبه ابزار SQL و سیستم نقشه برداری شیء-رابطه ای (ORM) برای پایتون است و یک ارتباط با پایگاه داده SQLite ایجاد می کند، سپس نحوه ایجاد جلسات را تعریف می کند.
و در نهایت یک کلاس Base برای تعریف جداول پایگاه داده راه اندازی می کند.
from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# Create a sqlite engine instance
engine = create_engine("sqlite:///enad-core.db")
# Create SessionLocal class from sessionmaker factory
SessionLocal = sessionmaker(bind=engine, expire_on_commit=False)
# Create a DeclarativeMeta instance
Base = declarative_base()
create_engine
برای تنظیم اتصال به پایگاه داده استفاده می شود و Column، Integer، String و Boolean کلاس هایی هستند که برای تعریف ساختار جدول پایگاه داده استفاده می شوند.
declarative_base
یک کلاس پایه است که توسط همه مدل ها استفاده می شود در حالی که sessionmaker کارخانه ای است که اشیاء Session جدید ایجاد می کند.
را create_engine
تابع یک نمونه موتور جدید را برای پایگاه داده SQLite راه اندازی می کند که داده ها را در فایلی به نام enad-core.db ذخیره می کند. تمام اتصالات استفاده شده توسط SQLAlchemy از این موتور می آید.
SessionLocal
از ایجاد شده است sessionmaker
عملکرد کارخانه من هنگام فراخوانی اشیاء Session جدید تولید می کنم. سپس از این اشیاء به عنوان یک “دسته” برای پایگاه داده استفاده می شود که امکان درخواست های پایگاه داده را فراهم می کند.
را declarative_base
تابع برای ایجاد یک جدید فراخوانی می شود Base
کلاس این Base
کلاس به عنوان کلاس پایه برای همه مدلهای SQLAlchemy عمل میکند که بعداً نشان خواهیم داد.
شروع برنامه در پوشه /backend/app در فایلی به نام main.py است
from fastapi import FastAPI
from backend.app.routers import person_routers_v1
from backend.app.db import Base, engine
def create_app():
app = FastAPI()
app.include_router(person_routers_v1.router, prefix="/api")
return app
# Create the database
Base.metadata.create_all(engine)
app = create_app()
کد قبلی یک برنامه FastAPI با مجموعه ای از مسیرها ایجاد می کند و پایگاه داده SQLite را با استفاده از SQLAlchemy راه اندازی می کند.
جدا از وارد شدن fastapi، ماژول person_routers_v1 که حاوی روترهای “person” است نیز وارد شده است. پایه و موتور کلاس های SQLAlchemy هستند که برای تعامل با پایگاه داده استفاده می شوند.
کارکرد create_app
تابعی است که یک نمونه برنامه FastAPI را تعریف و برمی گرداند. این شامل مسیرهای روتر person_routers_v1 است و دارای پیشوند “/api” است. این بدان معنی است که تمام مسیرهای تعریف شده در person_routers_v1 دارای “/api” قبل از مسیر خود هستند.
را Base.metadata.create_all(engine)
خط تمام جداول پایگاه داده را از کلاس هایی که از Base به ارث می برند ایجاد می کند.
app = create_app()
یک نمونه از برنامه FastAPI را با فراخوانی ایجاد می کند create_app
تابع.
کد باقیمانده سپس در سه پوشه سازماندهی شده است: مدل ها، روترها و طرحواره ها
در پوشه روترها فایل person_routers_v1.py را داریم. این شامل اجرای CRUD (ایجاد، بازیابی، به روز رسانی، حذف) API برای یک مدل “Person” با استفاده از چارچوب FastAPI است و از SQLAlchemy برای ارتباطات پایگاه داده استفاده می کند.
from fastapi import APIRouter, Depends, HTTPException, status
from backend.app.db import SessionLocal
from sqlalchemy.orm import Session
import backend.app.models.person_models_v1 as person_models_v1
import backend.app.schemas.person_schemas_v1 as person_schemas_v1
def get_session():
session = SessionLocal()
try:
yield session
finally:
session.close()
router = APIRouter(
prefix="/v1/persons",
tags=["persons"],
responses={404: {"description": "Not found"}},
)
@router.get("", response_model=person_schemas_v1.PersonListResponse, status_code=status.HTTP_200_OK)
def get_persons(session: Session = Depends(get_session)):
# get all persons
persons_list = session.query(person_models_v1.Person).all()
return {"data": persons_list}
توجه: بقیه را می توانید در مخزن پیدا کنید: https://github.com/jenad88/enad-project-1
را get_session
تابع با استفاده از SQLAlchemy با پایگاه داده ارتباط برقرار می کند SessionLocal
و سپس جلسه را برای معامله ارائه می دهد. پس از انجام معامله، جلسه بسته می شود.
روتر APIRouter با پیشوند URL و برخی فراداده برای مستندات و مدیریت خطا مقداردهی اولیه می شود.
دکوراتور روتر برای مرتبط کردن روش های درخواست HTTP (GET، POST، PUT، DELETE) با عملکردهای مربوطه استفاده می شود. این توابع مسئول رسیدگی به عملیات CRUD در مدل “Person” هستند.
را get_persons
تابع تمام ورودی های Person را از پایگاه داده بازیابی می کند و آنها را برمی گرداند.
کمی طولانی می شود، بنابراین فعلاً در اینجا به پایان می رسد.