لوگوی فریم‌ورک Fusion ساخته Cipher UnitFusion

شروع کار

نصب Fusion Framework برای پایتون و نوشتن اولین API

نصب

pip install fusion-framework

با Fusion Tool پروژه را scaffold کنید تا چیدمان استاندارد (main.py، core/settings.py، ماژول نمونهٔ products و فایل‌های محیط) را بگیرید:

fusion init --lang python --name my-app --description "My Fusion API"
cd my-app
pip install fusion-framework

چیدمان پروژه (خروجی fusion init)

├── main.py                          # نقطهٔ ورود — همیشه اپ را از اینجا شروع کنید
├── core/
│   └── settings.py
└── src/
    └── modules/
        └── products/
            └── products.py          # ماژول نمونه — این الگو را ویرایش / کپی کنید

main.py

نقطهٔ ورود ماژول‌ها را import می‌کند (تا کلاس‌های @route ثبت شوند)، settings را بار می‌کند، middleware اختیاری را ثبت می‌کند، سپس سرور را شروع می‌کند. منطق startup را اینجا نگه دارید — listen() را داخل فایل‌های ماژول نگذارید:

"""Entry point: register routes, middleware, and start the server."""

import src.modules.products.products  # registers @route classes

from fusion_framework.app import FusionApp
from fusion_framework.config import get_settings, load_settings_module

# Global middleware (optional). Framework ships with none by default.
MIDDLEWARE: list = []


def main() -> None:
    load_settings_module("settings")
    app = FusionApp(get_settings())
    for middleware in MIDDLEWARE:
        app.use(middleware)
    app.listen()


if __name__ == "__main__":
    main()

وقتی ماژول دیگری اضافه می‌کنید، همان‌طور در main.py import کنید. ببینید: Middleware و Config.

ماژول نمونهٔ products

fusion init یک API کوچک products می‌آورد. Handlerها را روی زیرکلاس FusionBaseApi می‌نویسید و متادیتای Swagger را روی @route می‌گذارید:

from fusion_framework.api import FusionBaseApi
from fusion_framework.route import route
from fusion_framework import status


@route(
    "api/[module]/",
    tags=["swagger"],
    desc="Fusion Framework Api",
    version="v1",
    deprecated=False,
)
class ProductModule(FusionBaseApi):
    """Product management module."""

    def get(self):
        return self.response({"products_id": 12}, status=status.HTTP_SUCCESS)

    def post(self):
        return self.response({"products_id": 12}, status=status.HTTP_201_CREATED)

    def delete(self):
        return self.response({"products_id": 12}, status=status.HTTP_204_NO_CONTENT)

    def patch(self):
        return self.response({"products_id": 12}, status=status.HTTP_SUCCESS)

[module] از نام کلاس حل می‌شود (ProductModule → product)، پس این route می‌شود /api/product/.

گزینه‌های Swagger به‌ازای route روی @route:

آرگومانهدف
tagsتگ‌های OpenAPI (گروه‌بندی در Swagger UI)
descتوضیحات عملیات / API
titleعنوان اختیاری
versionمتادیتای نسخهٔ API
deprecatedعلامت منسوخ در OpenAPI

تنظیمات سراسری Swagger UI (مسیر، طرح‌های auth، گزینه‌های UI) در fusion.<env>.json است — ببینید دستورات و محیط‌ها.

اجرا

fusion command run:dev

سپس باز کنید:

Swagger به‌طور خودکار از ماژول‌های @route ساخته می‌شود. با UI endpointهای نمونهٔ products را کاوش و صدا بزنید.

کدهای وضعیت

به‌جای عدد خام از ماژول status استفاده کنید:

from fusion_framework import status

status.HTTP_SUCCESS        # 200
status.HTTP_201_CREATED    # 201
status.HTTP_204_NO_CONTENT # 204
status.HTTP_404_NOT_FOUND  # 404
return self.response({"ok": True}, status=status.HTTP_SUCCESS)

Handlerها

متدهای HTTP را مثل همیشه پیاده کنید: get, post, put, patch, delete.

بایندینگ پارامتر

آرگومان‌ها از امضای متد گرفته می‌شوند. منبع به نام پارامتر بستگی دارد:

  1. اگر نام با پارامتر path یکی باشد → path
  2. وگرنه اگر متد POST / PUT / PATCH باشد و نام در JSON body باشد → body
  3. وگرنه اگر نام در query string باشد → query
  4. پارامترهای اختیاری گم‌شده (default یا annotation) به‌صورت None می‌آیند
from fusion_framework.api import FusionBaseApi
from fusion_framework.http import HTTPException
from fusion_framework.route import route
from fusion_framework import status


@route("api/[module]/{id}", tags=["items"], desc="Items by id")
class Items(FusionBaseApi):
    def get(self, id: int):
        return self.response({"id": id}, status=status.HTTP_SUCCESS)

    def post(self, id: int, title: str = "untitled"):
        # id ← path, title ← JSON body (optional via default)
        return self.response(
            {"id": id, "title": title},
            status=status.HTTP_201_CREATED,
        )


@route("api/[module]/", tags=["products"], desc="Products list")
class Products(FusionBaseApi):
    def get(self, id: int):
        # GET /api/products/?id=12
        if not id:
            raise HTTPException(400, {"message": "id is required"})
        return self.response({"products_id": id}, status=status.HTTP_SUCCESS)

یادتان باشد: ماژول‌های جدید را زیر src/modules/... بگذارید و از main.py import کنید. Startup اپ (load_settings_module / FusionApp / listen) فقط در main.py بماند.

جزئیات: Router.

پاسخ‌ها

از self.response(body, status=status.HTTP_SUCCESS, **headers) برای envelope پاسخ استفاده کنید. Dict و list توسط هسته به‌صورت JSON سریال می‌شوند.

خطاها

from fusion_framework.http import HTTPException

raise HTTPException(404, {"detail": "not found"})

Handlerهای async

@route("/")
class Root(FusionBaseApi):
    def get(self):
        return self.response({"status": "ok"}, status=status.HTTP_SUCCESS)

    async def post(self):
        return self.response({"status": "async ok"}, status=status.HTTP_SUCCESS)

راهنمای کامل: Async.

پیکربندی

تنظیمات runtime از fusion.<env>.json می‌آید (FUSION_ENV، پیش‌فرض dev). در main.py با load_settings_module / get_settings بارشان کنید.

راهنمای کامل: Config. همچنین دستورات و محیط‌ها.

Middleware

به‌طور پیش‌فرض هیچ middleware اجرا نمی‌شود. خودتان در main.py ثبت کنید (MIDDLEWARE + app.use) یا روی @route(..., middleware=..., roles=...).

راهنمای کامل: Middleware.

APIهای اصلی

نمادنقش
FusionBaseApiنمای request (method, path, body, headers, params, query, state) و response(...)
route(...)ثبت ماژول؛ متادیتای Swagger + اختیاری middleware / roles
router(path)Alias برای route(path) بدون متادیتای Swagger
statusثابت‌های وضعیت HTTP (HTTP_SUCCESS → 200، …)
FusionApp / app.use / listenاپ + middleware سراسری — از main.py صدا بزنید
load_settings_module / get_settingsبارگذاری fusion.<env>.json + core/settings.py
HTTPExceptionپرتاب پاسخ خطای HTTP

در زیرساخت، PyO3 به fusion-core برای مسیریابی، بایندینگ و سریالایز پل می‌زند.

در این صفحه