FA-TOOLS — Header Component
آموزش FastAPI — ساخت API سریع با پایتون

آموزش FastAPI — ساخت API سریع با پایتون

FastAPI در یک نگاه

آموزش FastAPI — ساخت API سریع با پایتون — تصویر 2

سرعت بالا

با استفاده از Starlette و Pydantic، عملکردی همتراز با NodeJS و Go.

مستندسازی خودکار

تولید خودکار مستندات OpenAPI (Swagger UI و ReDoc) برای API شما.

اعتبارسنجی داده

استفاده از Type Hints پایتون و Pydantic برای اعتبارسنجی قوی و خودکار داده‌ها.

توسعه سریع

کدنویسی کمتر، باگ کمتر و بهره‌وری بالاتر با سینتکس ساده و شهودی.

FastAPI چیست و چرا باید از آن استفاده کنیم؟

آموزش FastAPI — ساخت API سریع با پایتون — تصویر 3

FastAPI یک فریم‌ورک وب مدرن، سریع (با کارایی بالا) برای ساخت API با پایتون ۳.۷+ است که بر اساس تایپ‌هینت‌های استاندارد پایتون ساخته شده. این فریم‌ورک امکان توسعه سریع APIها را فراهم می‌کند و همزمان به طور خودکار مستندسازی OpenAPI و UI مربوطه (مانند Swagger UI و ReDoc) را برای شما ایجاد می‌کند. اگر به دنبال ساخت APIهای RESTful قدرتمند، سریع و قابل نگهداری هستید، FastAPI یک انتخاب عالی است.

ویژگی‌های کلیدی FastAPI

FastAPI نه تنها کارایی بالایی دارد، بلکه تجربه توسعه‌دهنده را نیز بهبود می‌بخشد. در ادامه به برخی از مهم‌ترین ویژگی‌های آن می‌پردازیم:

  • سرعت بالا: این فریم‌ورک یکی از سریع‌ترین فریم‌ورک‌های پایتون است و عملکرد آن با Node.js و Go برابری می‌کند. این سرعت به دلیل استفاده از Starlette برای قسمت وب و Pydantic برای اعتبارسنجی داده‌ها است.
  • توسعه سریع: با حداقل کدنویسی و نیاز به رفع اشکال کمتر، می‌توانید ویژگی‌های جدید را با سرعت بیشتری اضافه کنید.
  • کدنویسی کمتر: تا ۳ برابر خطوط کد کمتر برای ساخت API نسبت به فریم‌ورک‌های مشابه.
  • کاهش باگ‌ها: با استفاده از تایپ‌هینت‌ها و اعتبارسنجی قوی Pydantic، خطاهای زمان اجرا (runtime errors) تا حد زیادی کاهش می‌یابند.
  • مستندسازی خودکار: FastAPI به صورت خودکار مستندات تعاملی API را بر اساس استاندارد OpenAPI (که شامل Swagger UI و ReDoc می‌شود) تولید می‌کند. این یعنی دیگر نیازی به نوشتن مستندات دستی و خسته‌کننده ندارید.
  • استاندارد باز: بر اساس استانداردهای OpenAPI و JSON Schema.
  • تزریق وابستگی (Dependency Injection): یک سیستم تزریق وابستگی بسیار قدرتمند و آسان برای استفاده دارد.
  • پشتیبانی از Async/Await: به طور کامل از قابلیت‌های ناهمگام پایتون (async/await) پشتیبانی می‌کند که برای عملیات I/O-bound بسیار مفید است.

نصب و راه‌اندازی FastAPI

برای شروع کار با FastAPI، ابتدا باید آن را نصب کنید. همچنین به یک سرور ASGI مانند Uvicorn نیاز دارید.

مراحل نصب:

  1. ایجاد محیط مجازی (اختیاری اما توصیه شده):

    همیشه بهتر است برای پروژه‌های پایتون خود از محیط‌های مجازی استفاده کنید تا وابستگی‌ها (Dependencies) با سایر پروژه‌ها تداخل پیدا نکنند.

    python -m venv venv_fastapi
    source venv_fastapi/bin/activate  # برای Linux/macOS
    .venv_fastapiScriptsactivate   # برای Windows
  2. نصب FastAPI و Uvicorn:

    حالا می‌توانید FastAPI و Uvicorn را با pip نصب کنید.

    pip install fastapi uvicorn

    اگر می‌خواهید تمام وابستگی‌های لازم برای اعتبارسنجی و مستندسازی را نیز نصب کنید (که توصیه می‌شود)، می‌توانید از دستور زیر استفاده کنید:

    pip install "fastapi[all]"

ساخت اولین API با FastAPI: سلام دنیا!

بعد از نصب، بیایید یک API ساده “سلام دنیا” بسازیم. یک فایل به نام `main.py` ایجاد کنید و کد زیر را در آن قرار دهید:

# main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "سلام دنیا!"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
    return {"item_id": item_id, "q": q}

برای اجرای این API، ترمینال را باز کرده و دستور زیر را در پوشه پروژه خود اجرا کنید:

uvicorn main:app --reload

main:app به این معنی است که app از فایل main.py را اجرا کن. پرچم --reload باعث می‌شود که هر بار که کد شما تغییر می‌کند، سرور به طور خودکار رفرش شود، که برای توسعه بسیار مفید است.

حالا می‌توانید با باز کردن مرورگر خود به آدرس
http://127.0.0.1:8000/
و
http://127.0.0.1:8000/items/5?q=somequery
API خود را تست کنید.

همچنین، مستندات خودکار API شما در آدرس
http://127.0.0.1:8000/docs (Swagger UI)
و
http://127.0.0.1:8000/redoc (ReDoc) در دسترس هستند.

پارامترهای مسیر (Path Parameters)

پارامترهای مسیر بخش‌هایی از URL هستند که مقدار خاصی را مشخص می‌کنند، مانند ID یک کاربر یا یک محصول. در FastAPI، آن‌ها را با `{}` در مسیر تعریف می‌کنید و سپس در تعریف تابع به‌عنوان آرگومان‌های تابع با تایپ‌هینت مشخص می‌کنید.

@app.get("/users/{user_id}")
async def read_user(user_id: int):
    return {"user_id": user_id}

در اینجا، user_id یک پارامتر مسیر است. FastAPI به طور خودکار آن را به نوع int تبدیل می‌کند و در صورت عدم توانایی تبدیل، خطای ۴۲۲ (Unprocessable Entity) را برمی‌گرداند.

ترتیب و اولویت پارامترهای مسیر

اگر چند پارامتر مسیر دارید، مهم است که ترتیب آن‌ها را رعایت کنید. مسیرهای خاص‌تر باید قبل از مسیرهای عمومی‌تر تعریف شوند.

@app.get("/users/me") # این مسیر باید قبل از /users/{user_id} باشد
async def read_user_me():
    return {"user_id": "current user"}

@app.get("/users/{user_id}")
async def read_user(user_id: int):
    return {"user_id": user_id}

پارامترهای کوئری (Query Parameters)

پارامترهای کوئری آنهایی هستند که بعد از علامت ? در URL می‌آیند و با & از هم جدا می‌شوند (مثال: `/items?skip=0&limit=10`). در FastAPI، هر پارامتری که بخشی از مسیر نباشد، به عنوان پارامتر کوئری در نظر گرفته می‌شود.

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

در این مثال، skip و limit پارامترهای کوئری هستند و مقادیر پیش‌فرض دارند. اگر کاربر آنها را در URL وارد نکند، از مقادیر پیش‌فرض استفاده می‌شود. اگر یک پارامتر کوئری بدون مقدار پیش‌فرض باشد، اجباری در نظر گرفته می‌شود.

پارامترهای کوئری اختیاری

برای تعریف پارامترهای کوئری اختیاری، می‌توانید از Optional از ماژول typing یا سینتکس جدیدتر پایتون (str | None) استفاده کنید:

from typing import Optional

@app.get("/products/")
async def read_products(name: str, price: Optional[float] = None):
    results = {"name": name}
    if price:
        results.update({"price": price})
    return results

در این مثال، name اجباری است اما price اختیاری است. اگر price ارسال نشود، مقدار آن None خواهد بود.

ارسال داده با Request Body و Pydantic

برای ارسال داده‌های پیچیده به API (مثلاً هنگام ایجاد یا به‌روزرسانی یک منبع)، از Request Body استفاده می‌کنیم. FastAPI از Pydantic برای تعریف ساختار داده و اعتبارسنجی آن استفاده می‌کند.

مدل‌های Pydantic

یک مدل Pydantic به شما اجازه می‌دهد تا شیوه دریافت داده را تعریف کنید. این مدل‌ها به طور خودکار به JSON Schema تبدیل می‌شوند و در مستندات API شما نیز ظاهر می‌شوند.

from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional

app = FastAPI()

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

@app.post("/items/")
async def create_item(item: Item):
    item_dict = item.dict()
    if item.tax:
        price_with_tax = item.price + item.tax
        item_dict.update({"price_with_tax": price_with_tax})
    return item_dict

در این مثال:

  • کلاس Item از BaseModel (از Pydantic) ارث‌بری می‌کند.
  • ما انواع داده‌ای (Type Hints) را برای هر فیلد تعریف کرده‌ایم.
  • Optional نشان‌دهنده فیلدهای اختیاری است.
  • در تابع create_item، آرگومان item: Item به FastAPI می‌گوید که انتظار یک Request Body با ساختار Item را دارد.

FastAPI به طور خودکار Request Body را به مدل Item تبدیل می‌کند و اعتبارسنجی‌های لازم را انجام می‌دهد. اگر داده‌ها معتبر نباشند، یک خطای ۴۲۲ مناسب برگردانده می‌شود.

اعتبارسنجی و مدیریت خطا

یکی از نقاط قوت FastAPI، اعتبارسنجی داده‌ها و مدیریت خطای خودکار آن است. Pydantic تمام این کارها را برای شما انجام می‌دهد.

قوانین اعتبارسنجی پیشرفته

شما می‌توانید با استفاده از کلاس‌های Field و Query از ماژول fastapi، قوانین اعتبارسنجی پیچیده‌تری را برای پارامترهای مسیر، کوئری و Request Body تعریف کنید.

from fastapi import FastAPI, Query, Path
from pydantic import BaseModel, Field

app = FastAPI()

class UserIn(BaseModel):
    username: str = Field(min_length=3, max_length=20)
    email: str = Field(pattern=r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$")
    password: str = Field(min_length=8)

@app.post("/users/")
async def create_user(user: UserIn):
    return user

@app.get("/search/")
async def search_items(
    q: str = Query(..., min_length=3, max_length=50, title="Search Query", description="Search string for items")
):
    results = {"query": q}
    return results

در این مثال:

  • برای username محدودیت طول تعیین شده است.
  • برای email از یک regex برای اعتبارسنجی فرمت استفاده شده.
  • q یک پارامتر کوئری اجباری (با ...) است که حداقل و حداکثر طول دارد و عنوان و توضیحات برای مستندات Swagger UI ارائه شده است.

خطاهای سفارشی

گاهی اوقات نیاز دارید که خطاهای سفارشی با کدهای وضعیت HTTP خاص برگردانید.

from fastapi import FastAPI, HTTPException

app = FastAPI()

fake_items_db = {"foo": {"name": "Foo"}, "bar": {"name": "Bar"}}

@app.get("/items/{item_id}")
async def read_item(item_id: str):
    if item_id not in fake_items_db:
        raise HTTPException(status_code=404, detail="Item not found")
    return fake_items_db[item_id]

با HTTPException می‌توانید یک خطای HTTP را با کد وضعیت و جزئیات دلخواه خود ایجاد کنید.

تزریق وابستگی (Dependency Injection)

سیستم تزریق وابستگی FastAPI فوق‌العاده قدرتمند و انعطاف‌پذیر است. این سیستم به شما امکان می‌دهد تا کدهای مشترک (مانند احراز هویت، اتصال به پایگاه داده، یا منطق تجاری) را در توابع جداگانه تعریف کرده و سپس آن‌ها را به عنوان وابستگی به توابع عملیات مسیر (path operation functions) خود تزریق کنید.

وابستگی ساده

یک تابع را به عنوان یک وابستگی تعریف کنید:

from fastapi import FastAPI, Depends, HTTPException, status

app = FastAPI()

async def common_parameters(q: str | None = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}

@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return commons

در اینجا، تابع common_parameters یک “وابستگی” است. FastAPI آن را اجرا می‌کند و نتیجه را به read_items تزریق می‌کند.

وابستگی برای امنیت (مثال)

تزریق وابستگی برای مدیریت احراز هویت بسیار کارآمد است:

from fastapi.security import OAuth2PasswordBearer
from fastapi import Header

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_user(token: str = Depends(oauth2_scheme)):
    # در اینجا باید توکن را اعتبارسنجی کنید
    # و کاربر مربوطه را برگردانید
    if token != "fake-super-secret-token":
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid authentication credentials",
            headers={"WWW-Authenticate": "Bearer"},
        )
    return {"username": "currentuser", "token": token}

@app.get("/users/me")
async def read_users_me(current_user: dict = Depends(get_current_user)):
    return current_user

این سیستم به شما اجازه می‌دهد تا کد احراز هویت را یک بار بنویسید و در هر جای پروژه که نیاز دارید، آن را استفاده کنید.

احراز هویت و مجوزدهی (Authentication & Authorization)

امنیت یک جنبه حیاتی در توسعه API است. FastAPI ابزارهایی برای پیاده‌سازی احراز هویت و مجوزدهی بر اساس استانداردهای باز فراهم می‌کند. این ابزارها عمدتاً بر اساس تزریق وابستگی و OAuth2 عمل می‌کنند.

OAuth2 و JWT

FastAPI از OAuth2 با Bearer tokens پشتیبانی می‌کند که یک روش رایج برای احراز هویت مبتنی بر توکن است. معمولاً در این روش از JSON Web Tokens (JWT) استفاده می‌شود.

from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jose import JWTError, jwt
from passlib.context import CryptContext
from datetime import datetime, timedelta

# این مقادیر را باید از متغیرهای محیطی یا فایل پیکربندی بخوانید
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

# توابع کمکی برای JWT
def create_access_token(data: dict, expires_delta: timedelta | None = None):
    to_encode = data.copy()
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=15)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

def verify_password(plain_password, hashed_password):
    return pwd_context.verify(plain_password, hashed_password)

def get_password_hash(password):
    return pwd_context.hash(password)

# دیتابیس کاربران فرضی
fake_users_db = {
    "john.doe": {
        "username": "john.doe",
        "hashed_password": get_password_hash("secret"),
        "email": "john@example.com",
        "full_name": "John Doe"
    }
}

def authenticate_user(username: str, password: str):
    user = fake_users_db.get(username)
    if not user or not verify_password(password, user["hashed_password"]):
        return False
    return user

async def get_current_active_user(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username: str = payload.get("sub")
        if username is None:
            raise credentials_exception
    except JWTError:
        raise credentials_exception
    user = fake_users_db.get(username) # در یک برنامه واقعی از دیتابیس می‌خوانید
    if user is None:
        raise credentials_exception
    return user

app = FastAPI()

@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
    user = authenticate_user(form_data.username, form_data.password)
    if not user:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Incorrect username or password",
            headers={"WWW-Authenticate": "Bearer"},
        )
    access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    access_token = create_access_token(
        data={"sub": user["username"]}, expires_delta=access_token_expires
    )
    return {"access_token": access_token, "token_type": "bearer"}

@app.get("/users/me/", response_model=dict) # یک مدل پاسخ Pydantic واقعی بهتر است
async def read_users_me(current_user: dict = Depends(get_current_active_user)):
    return current_user

این یک مثال کامل‌تر از نحوه پیاده‌سازی احراز هویت JWT با استفاده از FastAPI است. شامل توابعی برای هش کردن رمز عبور، ایجاد و اعتبارسنجی توکن دسترسی و یک نقطه پایانی برای ورود کاربران است.

ساختاردهی پروژه FastAPI

با بزرگتر شدن پروژه، بهتر است کد خود را در فایل‌ها و پوشه‌های مختلف سازماندهی کنید تا قابل نگهداری‌تر باشد. FastAPI از Routerهای APIRouter پشتیبانی می‌کند که امکان تقسیم API شما به ماژول‌های کوچکتر را فراهم می‌کند.

استفاده از APIRouter

یک ساختار رایج به این صورت است:

.
├── main.py
├── routers/
│   ├── __init__.py
│   ├── items.py
│   └── users.py
└── models/
    ├── __init__.py
    └── item.py
    └── user.py

routers/items.py:

from fastapi import APIRouter

router = APIRouter()

@router.get("/items/")
async def read_items():
    return [{"name": "Item Foo"}, {"name": "Item Bar"}]

@router.post("/items/")
async def create_item():
    return {"message": "Item created"}

main.py:

from fastapi import FastAPI
from routers import items, users # فرض کنید routers/users.py هم شبیه items.py است

app = FastAPI()

app.include_router(items.router, prefix="/api/v1", tags=["items"])
app.include_router(users.router, prefix="/api/v1", tags=["users"])

@app.get("/")
async def root():
    return {"message": "Welcome to the API"}

با این روش، می‌توانید API خود را به بخش‌های منطقی تقسیم کنید و هر بخش را در فایل جداگانه مدیریت کنید.

استقرار (Deployment)

هنگامی که API شما آماده شد، باید آن را روی یک سرور مستقر کنید تا در دسترس عموم قرار گیرد. Uvicorn یک انتخاب عالی برای توسعه است، اما برای تولید، معمولاً آن را با یک reverse proxy مانند Nginx یا Caddy ترکیب می‌کنند.

Uvicorn با Gunicorn

در محیط تولید، اغلب از Gunicorn به عنوان یک مدیریت فرآیند برای Uvicorn استفاده می‌شود تا چندین worker process را برای API شما اجرا کند و از منابع CPU به طور موثرتری بهره ببرد.

pip install gunicorn
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

در این دستور، --workers 4 چهار worker process را برای Uvicorn اجرا می‌کند.

استقرار با Docker

داکر یک روش بسیار محبوب برای بسته‌بندی و استقرار برنامه‌ها در محیط‌های مختلف است. FastAPI یک تصویر داکر رسمی دارد که شامل Uvicorn با Gunicorn است و برای استقرار بهینه شده است.

# Dockerfile
FROM python:3.9-slim-buster

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
# برای محیط پروداکشن:
# CMD ["gunicorn", "main:app", "--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000"]

این یک Dockerfile ساده است. برای ساخت تصویر: docker build -t my-fastapi-app . و برای اجرا: docker run -p 8000:8000 my-fastapi-app.

مقایسه FastAPI با سایر فریم‌ورک‌ها

FastAPI در اکوسیستم فریم‌ورک‌های وب پایتون جایگاه منحصر به فردی دارد. بیایید آن را با دو فریم‌ورک محبوب دیگر مقایسه کنیم: Flask و Django.

ویژگی FastAPI Flask Django
هدف اصلی ساخت APIهای سریع و مدرن فریم‌ورک میکرو وب (انعطاف‌پذیر) فریم‌ورک “باتری با همه چیز” برای وب‌سایت‌های کامل
سرعت و پرفورمنس بسیار بالا (همتراز با Go و Node.js) متوسط (قابل ارتقا با ابزارهای خارجی) متوسط تا بالا (برای پروژه‌های بزرگ)
اعتبارسنجی داده و Serialization بومی با Pydantic (فوق‌العاده قوی) نیاز به کتابخانه‌های خارجی (مانند Marshmallow) Django REST Framework (DRF) با Serializers
مستندسازی API خودکار (Swagger UI / ReDoc) دستی یا با ابزارهای خارجی با DRF و ابزارهای مربوطه
یادگیری و شروع آسان و سریع برای توسعه‌دهندگان پایتون آسان برای پروژه‌های کوچک منحنی یادگیری طولانی‌تر به دلیل حجم قابلیت‌ها
همگام‌سازی (Async/Await) بومی و کامل پشتیبانی محدودتر (نسخه‌های جدیدتر) پشتیبانی محدودتر (نسخه‌های جدیدتر)

عیب‌یابی سریع (Troubleshooting)

در طول توسعه با FastAPI، ممکن است با مشکلاتی روبرو شوید. در اینجا چند مشکل رایج و راه‌حل آنها آورده شده است.

مشکلات رایج و راه‌حل‌ها

  • ۱. خطای ۴۲۲ Unprocessable Entity

    علت: این خطا معمولاً به دلیل عدم تطابق داده‌های ارسالی با مدل Pydantic یا تایپ‌هینت‌های تعریف شده در تابع است. مثلاً ارسال رشته به جای عدد، یا از قلم افتادن یک فیلد اجباری.

    راه‌حل: پیام خطا را در پاسخ API با دقت بخوانید. FastAPI و Pydantic اطلاعات دقیقی درباره اینکه کدام فیلد مشکل دارد و چرا، ارائه می‌دهند. مستندات Swagger UI (/docs) نیز به شما کمک می‌کند تا ساختار صحیح Request Body را ببینید.

  • ۲. Uvicorn اجرا نمی‌شود یا خطای “Application startup failed” می‌دهد.

    علت: ممکن است در فایل main.py (یا هر فایل دیگری که app را تعریف کرده‌اید) خطای سینتکسی یا منطقی داشته باشید. همچنین، اطمینان حاصل کنید که نام فایل و نام متغیر app را در دستور uvicorn به درستی وارد کرده‌اید (مثلاً main:app).

    راه‌حل: خطاهای نمایش داده شده در ترمینال را بررسی کنید. اغلب اوقات، پایتون مسیر و شماره خط خطا را مشخص می‌کند. کد خود را برای یافتن مشکلات سینتکسی یا ایمپورت‌های ناموفق (import) چک کنید.

  • ۳. وابستگی‌ها (Dependencies) به درستی تزریق نمی‌شوند یا خطای Circular Dependency.

    علت: گاهی اوقات توابع وابسته به یکدیگر نیاز دارند که منجر به یک حلقه (loop) می‌شود. همچنین ممکن است تایپ‌هینت‌ها به درستی تعریف نشده باشند.

    راه‌حل: ساختار وابستگی‌های خود را بازبینی کنید تا از ایجاد حلقه‌های وابستگی جلوگیری شود. از Depends() به درستی استفاده کنید و مطمئن شوید که توابع وابستگی نیز تایپ‌هینت‌های صحیح دارند. برای حل مشکلات مربوط به وارد کردن ماژول‌ها در ساختار پروژه بزرگتر، از from __future__ import annotations در بالای فایل‌ها استفاده کنید تا مشکل Cyclic Imports حل شود.

  • ۴. مسیرهای API (Endpoints) در Swagger UI ظاهر نمی‌شوند.

    علت: این می‌تواند به دلیل عدم تعریف صحیح app.include_router() یا عدم فراخوانی app = FastAPI() باشد. اگر از APIRouter استفاده می‌کنید، مطمئن شوید که routerهای خود را در main.py به app اصلی اضافه کرده‌اید.

    راه‌حل: فایل main.py را بررسی کنید و از اینکه همه routerها با app.include_router() به درستی اضافه شده‌اند، اطمینان حاصل کنید. همچنین، اگر متد HTTP (مثلاً @app.post یا @router.get) را فراموش کرده باشید، مسیر نمایش داده نمی‌شود.

سوالات متداول (FAQ)

FastAPI برای چه نوع پروژه‌هایی مناسب است؟

FastAPI برای ساخت APIهای RESTful، میکروسرویس‌ها، سرورهای GraphQL (با استفاده از کتابخانه‌های جانبی) و هر نوع پروژه بک‌اند که نیاز به عملکرد بالا و توسعه سریع دارد، ایده‌آل است. به خصوص اگر نیاز به مستندسازی خودکار و اعتبارسنجی قوی داده‌ها دارید.

آیا FastAPI جایگزین Flask یا Django است؟

نه لزوماً جایگزین کامل. FastAPI در زمینه ساخت APIها و میکروسرویس‌ها برتری دارد. Flask یک فریم‌ورک میکرو است که برای پروژه‌های کوچک و APIهای ساده مناسب است، در حالی که Django یک فریم‌ورک کامل برای ساخت وب‌سایت‌ها با قابلیت‌های داخلی زیاد (مانند ORM و سیستم ادمین) است. FastAPI بیشتر بر قسمت بک‌اند و API تمرکز دارد، هرچند می‌توان از آن برای رندر کردن صفحات HTML نیز استفاده کرد.

آیا می‌توان از FastAPI برای ساخت Frontend نیز استفاده کرد؟

FastAPI عمدتاً برای ساخت بخش بک‌اند (API) طراحی شده است. برای بخش فرانت‌اند معمولاً از فریم‌ورک‌های جاوا اسکریپت مانند React، Vue.js یا Angular استفاده می‌شود. با این حال، می‌توانید فایل‌های استاتیک (HTML، CSS، JS) را با FastAPI سرو کنید و یا با استفاده از Jinja2، صفحات HTML را رندر کنید، اما این کار معمولاً برای فرانت‌اندهای پیچیده توصیه نمی‌شود.

آیا FastAPI از پایگاه داده پشتیبانی می‌کند؟

FastAPI به طور مستقیم ORM یا لایه دیتابیس داخلی ندارد، اما به راحتی می‌تواند با هر پایگاه داده‌ای (SQL یا NoSQL) و ORMهای پایتون (مانند SQLAlchemy، Tortoise-ORM، GINO) کار کند. شما از Dependency Injection می‌توانید برای مدیریت جلسات دیتابیس (database sessions) استفاده کنید.

نتیجه‌گیری

FastAPI یک تغییردهنده بازی در دنیای توسعه API با پایتون است. این فریم‌ورک با ترکیبی از سرعت بی‌نظیر، مستندسازی خودکار و اعتبارسنجی قدرتمند داده‌ها، تجربه توسعه‌دهنده را به شدت بهبود می‌بخشد. چه در حال ساخت یک میکروسرویس کوچک باشید و چه یک API بزرگ و پیچیده، FastAPI ابزارهای لازم برای انجام کار را به بهترین شکل در اختیار شما قرار می‌دهد. سادگی در کدنویسی و استفاده از تایپ‌هینت‌های پایتون، باعث کاهش باگ‌ها و افزایش خوانایی کد می‌شود که در نهایت منجر به تولید نرم‌افزارهای پایدارتر و با کیفیت‌تر خواهد شد. اگر هنوز آن را امتحان نکرده‌اید، وقت آن رسیده است که قدرت و سرعت FastAPI را کشف کنید.

 

Table of Contents

آخرین نوشته‌ها