در چشمانداز سریع توسعه وب پایتون، سرعت، ایمنی نوع داده و تجربه توسعهدهنده اهمیت حیاتی دارند. در حالی که جنگو و فلاسک سالها مسلط بودند، FastAPI به عنوان یک فریمورک وب با عملکرد بالا و مقیاس سازمانی برای ساخت APIها ظهور کرده است. با بهرهگیری از نشانهای نوع استاندارد پایتون و قابلیتهای ناهمگام مدرن، FastAPI به توسعهدهندگان اجازه میدهد سیستمهای مستحکمی با حداقل کدهای تکراری بسازند.
این پست به بررسی الگوهای معماری اصلی، بهترین شیوهها و پیادهسازیهای عملی مورد نیاز برای ساخت APIهای REST آماده تولید با استفاده از FastAPI میپردازد. ما فراتر از آموزشهای مقدماتی حرکت کرده و به بحث درباره تزریق وابستگی، اعتبارسنجی داده و بهینهسازی عملکرد ناهمگام خواهیم پرداخت.
چرا FastAPI را انتخاب کنیم؟
FastAPI بر پایه Starlette برای بخشهای وب و Pydantic برای بخشهای تجزیه و اعتبارسنجی داده ساخته شده است. این ترکیب مزایای متمایزی نسبت به فریمورکهای سنتی ارائه میدهد:
- عملکرد بالا: این فریمورک یکی از سریعترین فریمورکهای پایتون موجود است که به دلیل پشتیبانی از ناهمگامی و پایه بومی Starlette، با NodeJS و Go رقابت میکند.
- مستندسازی خودکار: این فریمورک به طور خودکار مستندات OpenAPI (Swagger UI و ReDoc) را بر اساس کد و نشانهای نوع شما تولید میکند که نیاز به ابزارهای مستندسازی جداگانه را از بین میبرد.
- ایمنی نوع داده: با تکیه بر نشانهای نوع پایتون، FastAPI تبدیل داده، اعتبارسنجی و تولید مستندات خودکار را فراهم میکند.
ساختاردهی برنامه شما
برای توسعهدهندگان متوسط و پیشرفته، یک برنامه تکفایلی کافی نیست. یک ساختار ماژولار با استفاده از روترها برای قابلیت نگهداری ضروری است. بیایید یک ساختار دایرکتوری استاندارد و پیادهسازی آن را بررسی کنیم.
رویکرد مبتنی ماژول را در نظر بگیرید که در آن مسیرها به فایلهای جداگانه تقسیم شدهاند. در اینجا نمونهای از یک نقطه پایانی API پایه با استفاده از FastAPI آورده شده است:
from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel
from typing import List, Optional
app = FastAPI(title="User Management API", version="1.0.0")
# تعریف مدلهای Pydantic برای اعتبارسنجی درخواست/پاسخ
class UserBase(BaseModel):
email: str
username: str
full_name: Optional[str] = None
class UserCreate(UserBase):
password: str
class UserResponse(UserBase):
user_id: int
class Config:
from_attributes = True
# ذخیرهسازی در حافظه برای اهداف نمایشی
fake_users_db = {}
current_user_id = 0
# وابستگی برای شبیهسازی جلسات پایگاه داده یا بررسیهای احراز هویت
def get_db_session():
# در یک برنامه واقعی، این یک جلسه پایگاه داده را بازگردانی میکند
return {"status": "connected"}
@app.post("/users/", response_model=UserResponse, status_code=201)
async def create_user(user: UserCreate, db = Depends(get_db_session)):
"""
ایجاد کاربر جدید. ورودی را با استفاده از Pydantic اعتبارسنجی میکند.
"""
global current_user_id
current_user_id += 1
# بررسی ایمیل تکراری
if user.email in fake_users_db:
raise HTTPException(status_code=400, detail="Email already registered")
user_data = UserResponse(
user_id=current_user_id,
email=user.email,
username=user.username,
full_name=user.full_name
)
fake_users_db[user.email] = user_data
return user_data
@app.get("/users/", response_model=List[UserResponse])
def read_users(skip: int = 0, limit: int = 10):
"""
بازیابی لیستی از کاربران با پشتیبانی از صفحهبندی.
"""
users = list(fake_users_db.values())
return users[skip : skip + limit]
بهرهگیری از Pydantic برای یکپارچگی داده
هسته موتور اعتبارسنجی FastAPI، Pydantic است. برخلاف فلاسک که ممکن است JSON را به صورت دستی تجزیه و فیلدها را اعتبارسنجی کنید، FastAPI از مدلهای Pydantic برای تعریف شکل مورد انتظار دادههای شما استفاده میکند. این امر تضمین میکند که تنها دادههای معتبر وارد منطق برنامه شما شوند.
ویژگیهای کلیدی که باید مورد استفاده قرار گیرند عبارتند از:
- اعتبارسنجی فیلد: از
Field()برای تنظیم حداقل طول، الگوهای regex یا مقادیر پیشفرض استفاده کنید. - اعتبارسنجیهای سفارشی: از تزئینگرهای
@validatorیا@field_validatorبرای افزودن قوانین اعتبارسنجی منطق کسبوکار سفارشی استفاده کنید. - کلاسهای پیکربندی: رفتار مدل Pydantic را پیکربندی کنید، مانند اجازه دادن به فیلدهای اضافی یا تنظیم قوانین سریالسازی.
بهترین شیوههای ناهمگام
FastAPI از نحو ناهمگام async و await پشتیبانی میکند. هنگام استفاده از نقاط پایانی ناهمگام، بسیار مهم است که از عملیات مسدودکننده پرهیز کنید. اگر با پایگاه داده یا یک API خارجی تعامل دارید، از کتابخانههای ناهمگام (مانند asyncpg برای PostgreSQL یا httpx برای درخواستهای HTTP) استفاده کنید تا ورودی/خروجی غیرمسدودکننده را حفظ کنید.
برای مثال، هنگام فراخوانی یک سرویس خارجی، ترجیح دهید:
import httpx
from fastapi import HTTPException
async def get_external_data(url: str):
async with httpx.AsyncClient() as client:
try:
response = await client.get(url)
response.raise_for_status()
return response.json()
except httpx.HTTPStatusError as e:
raise HTTPException(status_code=e.response.status_code, detail=e.response.text)
با این حال، با وظایف وابسته به CPU احتیاط کنید. اگر محاسبات سنگینی انجام میدهید، در نظر بگیرید که از run_in_executor برای واگذار کردن وظیفه به یک صف نخ استفاده کنید تا از مسدود شدن حلقه رویداد جلوگیری شود.
نتیجهگیری
FastAPI نمایانگر یک جهش بزرگ در توسعه API پایتون است. با ترکیب آشنایی پایتون با عملکرد فریمورکهای ناهمگام و دقت اعتبارسنجی ایمن نوع داده، به توسعهدهندگان اجازه میدهد برنامههای مقیاسپذیر، امن و به خوبی مستندسازی شده بسازند. برای توسعهدهندگانی که از فلاسک یا جنگو مهاجرت میکنند، منحنی یادگیری قابل مدیریت است و مزایای بلندمدت از نظر قابلیت نگهداری و عملکرد قابل توجه است. شروع به ادغام نشانهای نوع در مدلهای Pydantic خود کنید، از تزریق وابستگی برای کد تمیزتر استفاده کنید و اکوسیستم ناهمگام را برای باز کردن کامل پتانسیل FastAPI در آغوش بگیرید.