در منظره سریعاً در حال تحول توسعه وب پایتون،
FastAPI به عنوان یک چارچوب برجسته برای ساخت API های با عملکرد بالا و یادگیری آسان ظهور کرده است. FastAPI که توسط سباستین ریموند طراحی شده، از راهنماهای نوع مدرن پایتون برای ارائه اعتبارسنجی خودکار دادهها، سریالسازی و مستندات تعاملی استفاده میکند. برای توسعهدهندگان متوسط و پیشرفته، درک نقاط قوت معماری FastAPI برای ساخت سرویسهای بکاند مقیاسپذیر، قابل نگهداری و مقاوم حیاتی است.
چرا FastAPI را انتخاب کنیم؟
FastAPI برای بخشهای وب بر پایه Starlette و برای اعتبارسنجی دادهها بر پایه Pydantic ساخته شده است. این ترکیب مزایای متمایزی نسبت به چارچوبهای سنتی مانند Flask یا Django REST Framework ارائه میدهد:
1. **عملکرد بالا**: به لطف پیادهسازی کارآمد Starlette و Pydantic، عملکردی قابل مقایسه با NodeJS و Go دارد.
2. **پشتیبانی از حالت ناهمگام (Async)**: پشتیبانی بومی از کدهای ناهمگام، که امکان انجام عملیات I/O غیرمسدودکننده را فراهم میکند و برای مدیریت درخواستهای با همزمانی بالا ضروری است.
3. **مستندات خودکار**: به صورت پیشفرض با Swagger UI (OpenAPI 3.0) و ReDoc یکپارچه میشود و رابط کاربری دوستانهای برای تست و مستندسازی API ارائه میدهد.
4. **ایمنی نوع (Type Safety)**: با استفاده از راهنماهای نوع پایتون، FastAPI میتواند خطاها را در مراحل اولیه شناسایی کرده و پشتیبانی عالی IDE را فراهم کند که به طور قابل توجهی باگهای زمان اجرا را کاهش میدهد.
راهاندازی محیط کار
قبل از غرق شدن در کدنویسی، مطمئن شوید که Python 3.7 یا نسخه بالاتر نصب شده است. یک محیط مجازی برای مدیریت وابستگیها ایجاد کنید و FastAPI و Uvicorn (یک سرور ASGI) را نصب نمایید:
pip install fastapi uvicorn
پس از نصب، آماده ساخت اولین نقطه پایانی (Endpoint) خود هستید. در اینجا یک مثال مینیمال که مسیریابی و مدلسازی پاسخ را نشان میدهد، آورده شده است:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "message": "Item created"}
در این قطعه کد، کلاس
Item از Pydantic برای تعریف ساختار مورد انتظار بدنه درخواست استفاده میکند. FastAPI به صورت خودکار دادههای JSON ورودی را بر اساس این طرح اعتبارسنجی میکند. اگر دادهها مطابقت نداشته باشند (برای مثال، به جای یک عدد اعشاری، یک رشته ارائه شود)، FastAPI به صورت خودکار یک خطای اعتبارسنجی دقیق باز میگرداند.
تزریق وابستگی: قلب تپنده FastAPI
یکی از قدرتمندترین ویژگیهای FastAPI، سیستم تزریق وابستگی آن است. این ویژگی به شما امکان میدهد منطق کسبوکار خود را از نقاط پایانی API جدا کنید که منجر به کد تمیزتر و قابلبازاستفادهتر میشود. وابستگیها میتوانند برای جلسات پایگاه داده، بررسیهای احراز هویت یا تنظیمات پیکربندی استفاده شوند.
سناریویی را در نظر بگیرید که نیاز دارید قبل از دسترسی به منابع خاص، احراز هویت کاربر را تأیید کنید. میتوانید یک تابع وابستگی ایجاد کنید که توکن کاربر را استخراج و اعتبارسنجی نماید:
from fastapi import Depends, HTTPException, status
def get_current_user(token: str = Depends(oauth2_scheme)):
user = decode_token(token)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"},
)
return user
@app.get("/secure-data")
def read_secure_data(current_user: User = Depends(get_current_user)):
return {"message": f"Access granted for {current_user.username}"}
با اعلام
current_user: User = Depends(get_current_user) در تابع عملیات مسیر، FastAPI به صورت خودکار
get_current_user را فراخوانی کرده، نتیجه را به نقطه پایانی منتقل میکند و هرگونه استثنا (Exception) که در طول این فرآیند ایجاد شود را مدیریت مینماید. این امر منطق نقطه پایانی را بر نیازهای اصلی کسبوکار متمرکز نگه میدارد.
برنامهنویسی ناهمگام
FastAPI هم از توابع استاندارد و هم از توابع ناهمگام پشتیبانی میکند. برای وظایف وابسته به I/O مانند پرسوجوهای پایگاه داده یا تماسهای API خارجی، استفاده از
async def به شدت توصیه میشود. این امر به سرور اجازه میدهد تا چندین درخواست را به صورت همزمان بدون مسدود کردن حلقه رویداد (Event Loop) مدیریت کند.
import httpx
from fastapi import FastAPI
app = FastAPI()
@app.get("/fetch-data")
async def fetch_data():
async with httpx.AsyncClient() as client:
response = await client.get("https://api.example.com/data")
return response.json()
در این مثال، بلوک
async with تضمین میکند که کلاینت HTTP به درستی بسته شود، در حالی که
await از مسدود شدن رشته اجرا (Thread) در انتظار پاسخ جلوگیری میکند.
نتیجهگیری
FastAPI جهش قابل توجهی در توسعه وب پایتون محسوب میشود. ترکیب سرعت، سهولت استفاده و ویژگیهای قدرتمند مانند اعتبارسنجی خودکار و تزریق وابستگی، آن را به انتخابی ایدهآل برای توسعه REST API مدرن تبدیل کرده است. با بهرهگیری از راهنماهای نوع و برنامهنویسی ناهمگام، توسعهدهندگان میتوانند برنامههایی را بسازند که نه تنها مقاوم و امن، بلکه از نظر عملکردی نیز بسیار کارآمد باشند.
چه در حال ساخت یک میکروسرویس کوچک باشید و چه یک بکاند سازمانی پیچیده، FastAPI ابزارهای لازم برای مقیاسدهی کارآمد را فراهم میکند. از امروز شروع به آزمایش با راهنماهای نوع و تزریق وابستگی کنید تا پتانسیل کامل پروژههای پایتون خود را آزاد نمایید.