آموزش کار با FastAPI در پایتون
FastAPI یک فریمورک قدرتمند و سریع برای توسعه APIها در پایتون است که با استفاده از Python 3.7+ و توانمندیهای Pydantic و Starlette، امکان ساخت APIهای مدرن و مستند شده را فراهم میکند. در این آموزش به بررسی مفاهیم کلیدی، نحوه استفاده از FastAPI و پیادهسازی عملی میپردازیم.
چرا از FastAPI استفاده کنیم؟
- سرعت بالا: به دلیل استفاده از Starlette و Pydantic، FastAPI یکی از سریعترین فریمورکهای Python برای API است.
- تولید خودکار مستندات: با استفاده از OpenAPI و Swagger UI، مستندات API به صورت خودکار تولید میشوند.
- Validasyon و Serializasyon: Pydantic به طور پیشفرض برای اعتبارسنجی دادهها استفاده میشود.
- Support Async/Await: سازگاری کامل با برنامهنویسی ناهمزمان (Asynchronous Programming).
نصب و راهاندازی اولیه
برای شروع کار با FastAPI، نیاز به نصب پکیج آن دارید:
pip install fastapi uvicornدر اینجا uvicorn به عنوان سرور ASGI استفاده میشود. مثلاً برای اجرای یک برنامه ساده:
uvicorn main:app --reloadاین دستور فایل main.py را اجرا کرده و تغییرات را به صورت زنده بارگذاری میکند.
ساخت یک API ساده با FastAPI
در اینجا یک برنامه ساده برای شروع آموزش ارائه میدهیم:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello World"}در این کد، یک نمونه از FastAPI ایجاد شده است. سپس یک روت (route) به صورت GET با مسیر “/” تعریف شده است که یک پیام ساده برگرداند.
استفاده از مسیرها (Routes)
FastAPI از مفهوم path parameters و query parameters پشتیبانی میکند. به عنوان مثال:
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}این کد یک روت به نام /items/{item_id} ایجاد میکند که یک شناسه عددی (item_id) و یک پارامتر اختیاری (q) را دریافت میکند.
مدیریت دادهها با Pydantic
Pydantic برای اعتبارسنجی دادهها و تعریف مدلها استفاده میشود. این مدلها به صورت خودکار در مستندات API ظاهر میشوند:
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.post("/items/")
def create_item(item: Item):
return itemدر این کد، یک مدل Item با فیلدهای name, price, و is_offer تعریف شده است. سپس در روت POST، یک متد به نام create_item ایجاد شده که یک شیء از نوع Item را دریافت کرده و آن را بازگرداند.
استفاده از HTTP Status Codes
FastAPI به شما اجازه میدهد که کد وضعیت HTTP را مشخص کنید:
from fastapi import HTTPException
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id < 0:
raise HTTPException(status_code=404, detail="Item not found")
return {"item_id": item_id}در این مثال، اگر شناسه منفی باشد، یک خطای 404 برگردانده میشود.
استفاده از Dependency Injection
FastAPI امکان استفاده از Dependency Injection را فراهم میکند:
from fastapi import Depends
def get_db():
# ساختار پایگاه داده
db = "fake_db"
return db
@app.get("/items/")
def read_items(db: str = Depends(get_db)):
return {"db": db}در این کد، یک وابستگی (dependency) به نام get_db تعریف شده است. هر بار که روت /items/ فراخوانی میشود، این وابستگی فراخوانی میشود.
API Documentation خودکار با Swagger UI
FastAPI به صورت خودکار مستندات API را در دو محیط نمایش میدهد:
- /docs: Swagger UI
- /redoc: ReDoc
این امکانات برای تست و مستند کردن APIها بسیار مفید هستند.
بهینهسازی عملکرد با Async
FastAPI به صورت کامل از برنامهنویسی ناهمزمان پشتیبانی میکند:
@app.get("/async-items/{item_id}")
async def read_item_async(item_id: int):
# فرض کنید این عمل یک API خارجی است
return {"item_id": item_id}در این مثال، با استفاده از async/await، کد به صورت ناهمزمان اجرا میشود.
مقایسه FastAPI با Flask و Django REST Framework
| ویژگی | FastAPI | Flask | Django REST Framework |
|---|---|---|---|
| سرعت | بسیار سریع | متوسط | کندتر |
| اعتبارسنجی داده | خودکار با Pydantic | دستی | خودکار |
| مستندات خودکار | بله | نه | بله |
| پشتیبانی از Async | بله | نه | محدود |
نکات مهم در استفاده از FastAPI
- استفاده از Pydantic: مدلهای داده را با استفاده از Pydantic تعریف کنید.
- تجربه توسعه: به دلیل ساختار خودکار مستندات، توسعه APIها سریعتر و راحتتر است.
- پشتیبانی از OpenAPI: امکان اتصال به ابزارهایی مثل Postman، Swagger و غیره وجود دارد.
نمونه پروژه کامل
در اینجا یک نمونه ساده از یک API کامل شامل CRUD عملیات است:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
app = FastAPI()
items_db = []
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
@app.get("/")
def read_root():
return {"message": "Welcome to FastAPI"}
@app.post("/items/", response_model=Item)
def create_item(item: Item):
items_db.append(item)
return item
@app.get("/items/", response_model=List[Item])
def read_items():
return items_db
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id >= len(items_db):
raise HTTPException(status_code=404, detail="Item not found")
return items_db[item_id]این کد یک API ساده با عملیات GET و POST را ارائه میدهد. نسخه خروجی (response) از مدل Item استفاده میکند.
جمعبندی
FastAPI یک فریمورک پیشرفته و سریع برای توسعه APIها در پایتون است. با استفاده از قابلیتهایی مانند اعتبارسنجی خودکار، مستندات خودکار، پشتیبانی از Async و Dependency Injection، FastAPI به عنوان گزینهای مناسب برای توسعه APIهای حرفهای شناخته میشود.
آیا این مطلب برای شما مفید بود ؟




