Python Programming

ساخت APIهای GraphQL بلادرنگ با FastAPI و Strawberry برای دریافت داده‌های پویا

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

چرا FastAPI و Strawberry؟

FastAPI به دلیل عملکرد بالا و پشتیبانی بومی از برنامه‌نویسی ناهمگام (asynchronous)، چارچوبی ایده‌آل برای ساخت APIهای با هم‌زمانی بالا محسوب می‌شود. در عین حال، Strawberry یک کتابخانه مدرن GraphQL برای پایتون است که بر امنیت نوع‌محور و تجربه توسعه‌دهنده تمرکز دارد. برخلاف کتابخانه‌های قدیمی‌تر، Strawberry به‌طور یکپارچه با نوع‌های پایتون (type hints) ادغام می‌شود و از resolvers ناهمگام به صورت پیش‌فرض پشتیبانی می‌کند.

وقتی این دو کتابخانه با هم ترکیب می‌شوند، یک پشته قدرتمند را ارائه می‌دهند. FastAPI اتصالات WebSocket مورد نیاز برای اشتراک‌گذاری بلادرنگ را مدیریت می‌کند، در حالی که Strawberry تعریف نمودار نوع (schema) و حل پرس‌وجوهای GraphQL را بر عهده دارد. این تفکیک نگرش‌ها به توسعه‌دهندگان اجازه می‌دهد تا بر روی منطق تمرکز کنند نه زیرساخت‌ها، و تضمین می‌کند که API با مقیاس‌پذیری آن قابل نگهداری باقی بماند.

راه‌اندازی محیط پروژه

قبل از ورود به کدنویسی، اطمینان حاصل کنید که وابستگی‌های لازم نصب شده‌اند. شما به FastAPI، Strawberry GraphQL، پشتیبانی WebSocket برای Strawberry و یک سرور ASGI مانند Uvicorn نیاز دارید.

pip install fastapi strawberry-graphql uvicorn [all]

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

تعریف نمودار نوع با Strawberry

هسته هر API GraphQL، نمودار نوع آن است. Strawberry به ما اجازه می‌دهد تا انواع، تغییرات (mutations) و پرس‌وجوها را با استفاده از کلاس‌های پایتون تعریف کنیم. برای قابلیت‌های بلادرنگ، از strawberry.subscription برای تعریف اشتراک‌گذاری‌ها استفاده می‌کنیم.

import strawberry
import asyncio
from typing import AsyncGenerator
from datetime import datetime

@strawberry.type
class StockUpdate:
    symbol: str
    price: float
    timestamp: datetime
    volatility: str

class Query:
    @strawberry.field
    def current_price(self, symbol: str) -> str:
        return f"در حال دریافت قیمت برای {symbol}..."

@strawberry.subscription
async def stock_updates(self, symbol: str) -> AsyncGenerator[StockUpdate, None]:
    """
    یک اشتراک‌گذاری بلادرنگ که به‌روزرسانی‌های قیمت سهام را منتشر می‌کند.
    """
    while True:
        price = round(100 + (await asyncio.sleep(1)) * 10, 2)
        update = StockUpdate(
            symbol=symbol,
            price=price,
            timestamp=datetime.utcnow(),
            volatility="high" if price > 150 else "low"
        )
        yield update

در این مثال، ما یک اشتراک‌گذاری stock_updates تعریف می‌کنیم. این تابع داده‌ها را به صورت ناهمگام تولید می‌کند و یک جریان زنده را شبیه‌سازی می‌کند. کلاینت می‌تواند به یک نماد خاص اشتراک‌گذاری کند و به‌روزرسانی‌ها را بدون پینگ کردن سرگان دریافت کند که این امر به طور قابل توجهی تأخیر و بار سرور را کاهش می‌دهد.

یکپارچه‌سازی با FastAPI و مدیریت WebSocket

برای ارائه این نمودار نوع، آن را در یک برنامه FastAPI پیچیده می‌کنیم. GraphQLRouter در FastAPI، مسیریابی پرس‌وجوها، تغییرات و اشتراک‌گذاری‌های GraphQL به یک نقطه پایانی واحد را ساده می‌کند.

from fastapi import FastAPI
from strawberry.fastapi import GraphQLRouter

# تعریف نمودار نوع
schema = strawberry.Schema(query=Query, subscription=Subscription)

# ایجاد برنامه FastAPI
app = FastAPI(
    title="API GraphQL بلادرنگ",
    description="ساخت دریافت داده‌های پویا با FastAPI و Strawberry",
)

# نصب مسیریاب GraphQL
graphql_app = GraphQLRouter(schema)
app.include_router(graphql_app, prefix="/graphql")

# سرور اکنون آماده پردازش درخواست‌های GET برای پرس‌وجوها و اتصالات WS برای اشتراک‌گذاری‌ها است.

هنگام اجرای این برنامه با uvicorn main:app --reload، FastAPI به طور خودکار اتصالات HTTP استاندارد را به اتصالات WebSocket ارتقا می‌دهد، زمانی که کلاینت درخواست اشتراک‌گذاری می‌کند. این امکان را می‌دهد که سرور به محض در دسترس بودن داده، آن را به کلاینت ارسال کند.

بهینه‌سازی برای دریافت داده‌های پویا

یکی از مزایای کلیدی این معماری، توانایی آن در مدیریت درخواست‌های پویا است. از آنجا که کلاینت دقیقاً فیلدهای مورد نیاز خود را درخواست می‌کند، سرور فقط آنچه لازم است را حل می‌کند. در سناریویی که یک داشبورد نیاز به نمایش ۵۰ سهام مختلف دارد، کلاینت می‌تواند یک به‌روزرسانی دسته‌ای برای آن نمادهای خاص را درخواست کند و منطق اشتراک‌گذاری می‌تواند به‌روزرسانی‌ها را فیلتر یا مسیریابی کند.

علاوه بر این، ماهیت ناهمگام هم FastAPI و هم Strawberry تضمین می‌کند که عملیات وابسته به ورودی/خروجی (I/O)، مانند پرس‌وجوهای پایگاه داده یا تماس‌های API خارجی، حلقه رویداد را مسدود نمی‌کنند. این موضوع برای برنامه‌های بلادرنگ حیاتی است که ممکن است هزاران اتصال هم‌زمان به طور همزمان برقرار شوند.

نتیجه‌گیری

ساخت APIهای GraphQL بلادرنگ دیگر انحصار محیط‌های پیچیده Node.js نیست. با بهره‌گیری از اکوسیستم مدرن پایتون با FastAPI و Strawberry، توسعه‌دهندگان می‌توانند راه‌حل‌هایی بسیار کارآمد، نوع‌محور و مقیاس‌پذیر ایجاد کنند. این ترکیب به شما قدرت می‌دهد تا قابلیت‌های دریافت داده‌های پویا را ارائه دهید که تجربه کاربری را بهبود می‌بخشد و در عین حال معماری بک‌اند شما را تمیز و قابل نگهداری نگه می‌دارد. چه در حال ساخت یک داشبورد مالی، یک ویرایشگر مشارکتی یا یک برنامه چت زنده باشید، این پشته پایه‌ای را که برای موفقیت نیاز دارید، فراهم می‌کند.

Share: