برای ایجاد سرور WebSocket با FastAPI ابتدا باید محیط توسعه آماده شود. این مرحله شامل نصب پایتون، ایجاد محیط مجازی و نصب کتابخانههای مورد نیاز است. رعایت این مراحل باعث میشود پروژه شما قابل مدیریت باشد و از بروز مشکلات تداخل کتابخانهها جلوگیری شود.
نصب پایتون
اطمینان حاصل کنید که پایتون نسخه 3.8 یا بالاتر نصب شده باشد. نسخههای پایینتر ممکن است با کتابخانههای مورد استفاده سازگار نباشند.
python --version
اگر پایتون نصب نیست، میتوانید آن را از وبسایت رسمی پایتون دانلود و نصب کنید.
ایجاد محیط مجازی
برای جلوگیری از تداخل کتابخانهها بین پروژههای مختلف، توصیه میشود از محیط مجازی استفاده کنید. با دستور زیر یک محیط مجازی ایجاد کنید:
python -m venv venv
برای فعالسازی محیط مجازی:
# ویندوز
venv\Scripts\activate
# لینوکس و مک
source venv/bin/activate
پس از فعال شدن محیط مجازی، هر کتابخانهای که نصب شود فقط برای این پروژه خواهد بود.
نصب FastAPI و uvicorn
برای اجرای سرور FastAPI و پشتیبانی WebSocket به کتابخانههای زیر نیاز داریم:
- FastAPI: فریمورک اصلی برای ساخت API و WebSocket
- uvicorn: سرور ASGI برای اجرای پروژه
برای نصب همه موارد، دستور زیر را اجرا کنید:
pip install fastapi[all]
نمونه کد سرور WebSocket
پس از نصب ماژولها، یک فایل main.py ایجاد کنید و کد زیر را در آن قرار دهید:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"پیام شما دریافت شد: {data}")
این سرور یک endpoint WebSocket در مسیر /ws ایجاد میکند. کلاینت میتواند به آن متصل شود و پیام ارسال و دریافت کند.
اجرای سرور
برای اجرای سرور FastAPI از دستور زیر استفاده کنید:
fastapi dev --host 0.0.0.0 --port 8000
این دستور سرور را روی تمام آدرسهای شبکه موجود و پورت 8000 اجرا میکند و امکان اتصال کلاینتها از خارج از localhost را فراهم میکند.
نکات مهم
- استفاده از محیط مجازی باعث میشود پروژهها از هم مستقل باشند و مشکلات تداخل کتابخانه کاهش یابد.
- نسخه پایتون و کتابخانهها را مشخص نگه دارید تا پروژه روی سیستمهای مختلف بدون مشکل اجرا شود.
- برای پروژههای بزرگ، ساختار پروژه را طوری سازماندهی کنید که پوشههای جداگانه برای ماژولها و فایلها داشته باشد.