با این ترکیبی از ابزارهای مفید، در کمترین زمان یک API کاملاً مستند و خودکار راهاندازی و اجرا کنید.
ساختن یک REST API اغلب یک کار مکانیکی است که شامل تعداد زیادی طراحی دیگ بخار و برنامه نویسی چرخشی است. خوشبختانه، ابزارهایی مانند FastAPI می توانند بسیاری از جزئیات خسته کننده را از بین ببرند.
با استفاده از FastAPI، می توانید به سرعت یک REST API کارآمد و کامل برای برنامه CRUD خود بسازید. با MongoDB به عنوان منبع داده، این آموزش شما را به سمت راه اندازی API خود در کمترین زمان راهنمایی می کند.
FastAPI چیست؟
FastAPI یک چارچوب وب سریع و منبع باز پایتون برای ساخت API است. این پشتیبانی داخلی برای درخواستهای ناهمزمان، اعتبارسنجی خودکار دادهها و مستندسازی خودکار نقاط پایانی API فراهم میکند.
مزایای FastAPI نسبت به سایر چارچوب های پایتون
- FastAPI نسبتا سریعتر از سایر فریمورک ها مانند جنگو و فلاسک است. این به این دلیل است که FastAPI در بالای asyncio ایجاد میکند، یک کتابخانه ورودی/خروجی ناهمزمان برای پایتون که میتواند درخواستهای همزمان را سریعتر پردازش کند.
- FastAPI یک راه ساده و تمیز برای ساختن APIها با کمترین تلاش ارائه می دهد زیرا به کد کمتری نسبت به Flask یا Django نیاز دارد.
- در نهایت، FastAPI تولید اسناد برای نقاط پایانی را آسان می کند. از Swagger برای تولید اسنادی استفاده میکند که میتوانید با اجرای درخواستها و مشاهده پاسخها، نقاط پایانی را آزمایش کنید.
یک پایگاه داده MongoDB راه اندازی کنید
برای شروع، باید پایگاه داده MongoDB را به صورت محلی راه اندازی کنید. از طرف دیگر، میتوانید گزینه سادهتر راهاندازی خوشه MongoDB در Cloud را انتخاب کنید.
سپس، با استفاده از ابزار رابط کاربری گرافیکی نصب شده MongoDB، Compass، یک اتصال پایگاه داده ایجاد کنید. روی دکمه New Connection کلیک کنید و URI اتصال را برای برقراری ارتباط با سرور MongoDB در حال اجرا به صورت محلی ارائه دهید.
در نهایت، یک پایگاه داده و مجموعه جدید برای نگهداری داده های API آزمایشی خود ایجاد کنید.
یک سرور FastAPI راه اندازی کنید
با استفاده از یک ترمینال، یک پوشه پروژه ایجاد کنید و آن دایرکتوری جدید را وارد کنید.
می توانید کد این پروژه را در مخزن GitHub آن پیدا کنید.
در مرحله بعد، بررسی کنید که آیا پایتون نسخه 3.6+ را اجرا می کنید. اگر نه، آخرین نسخه پایتون را نصب کنید.
python --version
پس از آن، Virtualenv را برای ایجاد یک محیط توسعه مجازی ایزوله نصب کنید. این بسیار توصیه می شود زیرا به شما امکان می دهد از درگیری جلوگیری کنید، به خصوص اگر از نسخه های مختلف بسته ها برای پروژه های مختلف استفاده می کنید.
pip install virtualenv
بعد، یک محیط مجازی به نام “venv” در فهرست فعلی خود ایجاد کنید:
virtualenv venv
در نهایت محیط مجازی را فعال کنید.
# On Unix or MacOS:
source venv/bin/activate
# On Windows:
.\venv\Scripts\activate
هنگامی که محیط مجازی را پیکربندی کردید، بسته های FastAPI، PyMongo و Uvicorn را نصب کنید.
pip install fastapi pymongo uvicorn
PyMongo یک کتابخانه مبتنی بر پایتون برای کار با پایگاه داده MongoDB است. این یک API ارائه می دهد که از تمام ویژگی های MongoDB پشتیبانی می کند و به شما امکان می دهد بدون نیاز به نوشتن پرس و جوهای خام MongoDB با MongoDB تعامل داشته باشید.
از طرف دیگر Uvicorn یک وب سرور ناهمزمان است که مبتنی بر ماژول asyncio پایتون است. ویژگی اصلی آن بارگیری مجدد سرورهای FastAPI شما در حال حرکت است. استفاده از Uvicorn مشابه کار با Nodemon است.
سرور FastAPI را ایجاد کنید
در نهایت، یک سرور FastAPI ساده ایجاد کنید که به درخواستهای دریافتی از مسیر اصلی گوش میدهد. در پوشه اصلی پروژه خود، یک فایل server.py ایجاد کنید و کد زیر را اضافه کنید.
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def home():
return {"message": "Hello World"}
در نهایت، دستور زیر را اجرا کنید تا سرور توسعه بچرخد. Uvicorn برنامه شما را در پورت 8000 ارائه می کند.
uvicon server:app --reload
ادامه دهید و پاسخ سرور را در مرورگر خود در http://localhost:8000 مشاهده کنید.
REST API را با عملیات CRUD ایجاد کنید
اکنون REST API را بسازید که متدهای CRUD (ایجاد، خواندن، به روز رسانی و حذف) را پیاده سازی می کند. در پوشه اصلی پوشه پروژه خود، چهار پوشه ایجاد کنید: پیکربندی، مدلها، مسیرها و طرحوارهها.
├── config
├── models
├── routes
├── schemas
└── server.py
1. اتصال پایگاه داده را پیکربندی کنید
در پوشه config، یک فایل جدید به نام db.py ایجاد کنید و کد زیر را اضافه کنید.
from pymongo import MongoClient
db_connection = MongoClient("mongodb://localhost:27017")
db = db_connection.database_name
collection = db["collection_name"]
- از متد MongoClient() برای ایجاد اتصال به پایگاه داده MongoDB استفاده کنید. یک رشته URI اتصال را به عنوان آرگومان می گیرد که میزبان و پورت سرور MongoDB را مشخص می کند.
- دو متغیر مشخص می کنند که سرور باید به کدام پایگاه داده و مجموعه در سرور MongoDB شما دسترسی داشته باشد.
2. یک مدل داده را تعریف کنید
این مدل ساختار داده های شما را در پایگاه داده شامل فیلدها و انواع داده ها تعریف می کند.
در پوشه مدل، یک فایل جدید به نام user_model.py ایجاد کنید و کد زیر را اضافه کنید.
from pydantic import BaseModel
class User(BaseModel):
name: str
role: str
- کد بالا کلاسی به نام User ایجاد می کند که زیر کلاسی از کلاس BaseModel از کتابخانه Pydantic است. کلاس User دارای دو فیلد نام و نقش است که انواع دادههای آنها روی رشتهها تنظیم شده است.
- می توانید از کتابخانه Pydantic با FastAPI برای ایجاد مدل های داده استفاده کنید. همچنین میتوانید از آن برای اعتبارسنجی دادهها، سریالسازی (JSON به Python) و سریالزدایی (Python به JSON) استفاده کنید.
3. یک طرحواره داده را تعریف کنید
از مدل داده ایجاد شده، می توانید طرحی برای داده های خود تعریف کنید. در دایرکتوری schemas، یک فایل جدید ایجاد کنید: user_schema.py و کد زیر را اضافه کنید.
def user_serializer(user) -> dict:
return {
'id':str(user["_id"]),
'name':user["name"],
'role':user["role"]
}
def users_serializer(users) -> list:
return [user_serializer(user) for user in users]
4. مسیرهای API را تعریف کنید
در نهایت، مسیرهایی را برای عملیات های مختلف CRUD تعریف کنید.
در فهرست مسیرها، یک فایل جدید ایجاد کنید: user_routes.py و کد زیر را اضافه کنید.
افزودن داده با روش ارسال
مسیر پست را برای افزودن داده ایجاد کنید.
from fastapi import APIRouter
from models.user_model import User
from schemas.user_schema import users_serializer
from bson import ObjectId
from config.db import collection
user = APIRouter()
@user.post("/")
async def create_user(user: User):
_id = collection.insert_one(dict(user))
user = users_serializer(collection.find({"_id": _id.inserted_id}))
return {"status": "Ok","data": user}
- FastAPI متد APIRouter() را ارائه میکند که یک شی روتر را تعریف میکند که یک رابط برای ایجاد درخواستهای API به سرور ارائه میکند.
- مسیر پستی را مشخص کنید که با قرار دادن داده ها در مجموعه پس از سریال سازی، یک شی کاربر جدید در پایگاه داده ایجاد می کند. در مرحله بعد، inserted_id را ذخیره و ارسال کنید تا دادههای مرتبط در مجموعه را پیدا کنید و در نهایت، در صورت موفقیتآمیز بودن درخواست ارسال، وضعیت “Ok” را با دادههای موجود در پاسخ برگردانید.
- متدهای insert_one و find توسط کلاینت PyMongo تعریف می شوند.
اکنون کد زیر را به server.py اضافه کنید تا مسیرها را مقداردهی اولیه کنید.
from routes.user_routes import user
app.include_router(user)
ادامه دهید و مسیر پست را در مرورگر خود با استفاده از ابزار Swagger UI API ارائه شده توسط FastAPI آزمایش کنید.
خواندن داده ها با روش دریافت
پس از تعریف مسیر پست و مقداردهی اولیه مسیرها، بقیه مسیرها را تعریف کنید.
@user.get("/")
async def find_all_users():
users = users_serializer(collection.find())
return {"status": "Ok","data": users}
@user.get("/{id}")
async def get_one_user(id: str):
user = users_serializer(collection.find({"_id": ObjectId(id)}))
return {"status": "Ok","data": user}
دو مسیر دریافت را تعریف کنید که تمام داده های مجموعه را بازیابی می کند و داده های خاصی را از مجموعه بر اساس شناسه بازیابی می کند.
به روز رسانی داده ها با روش قرار دادن
مسیر put را برای به روز رسانی داده های ذخیره شده در پایگاه داده ایجاد کنید.
@user.put("/{id}")
async def update_user(id: str, user: User):
collection.find_one_and_update(
{
"_id": ObjectId(id)
},
{
"$set": dict(user)
})
user = users_serializer(collection.find({"_id": ObjectId(id)}))
return {"status": "Ok","data": user}
متد put از ID برای یافتن داده های خاص در مجموعه استفاده می کند و مقدار فیلدهای سند را با داده های جدید ارسال شده از API به روز می کند. سپس می توانید داده های به روز شده را بر اساس شناسه جستجو کنید و آن را در پاسخ API برگردانید.
حذف داده ها با روش حذف
مسیر حذف را برای حذف داده های ذخیره شده در پایگاه داده ایجاد کنید.
@user.delete("/{id}")
async def delete_user(id: str):
collection.find_one_and_delete({"_id": ObjectId(id)})
users = users_serializer(collection.find())
return {"status": "Ok","data": []}
مسیر حذف، شناسه سند خاصی را که میخواهید از مجموعه حذف کنید، میگیرد.
ایجاد REST API با FastAPI
FastAPI یک راه عالی برای ساخت راحت APIهای وب پایتون باطن ارائه می دهد. ابزارهای داخلی آن برای یکپارچه سازی پایگاه داده و تولید خودکار API، این فرآیند را ساده می کند.
حتی میتوانید این کار را یک قدم فراتر بردارید و اپلیکیشنهای کامل بسازید. سعی کنید با استفاده از فناوریهای محبوب مانند React، Angular یا Vue، یک کلاینت فرانتاند را ادغام کنید.