وب مدرن فراتر از چرخه درخواست-پاسخ سنتی پیش رفته است. از برنامههای چت زنده و ویرایشگرهای اسناد مشارکتی تا نمایشگرهای سهام و جدولهای امتیاز بازیها، کاربران اکنون بازخورد فوری را انتظار دارند. در حالی که Django سالهاست که استاندارد طلایی برای توسعه بکاند قدرتمند است، ماهیت همگام (سینکرون) آن به طور سنتی آن را برای این اتصالات پایدار و طولانیمدت کمتر مناسب میکرد. اینجا است که Django Channels وارد میشود.
در این راهنما، ما بررسی میکنیم که چگونه Django 5.0، همراه با کتابخانه Channels، پروژه Django شما را به یک برنامه ASGI (رابط گیتوی سرور ناهمگام) تبدیل میکند که قادر به مدیریت کارآمد WebSockets است. این مقاله برای توسعهدهندگان متوسط تا پیشرفته طراحی شده است که به دنبال پر کردن شکاف بین نمایههای سنتی Django و ارتباطات بلادرنگ هستند.
درک معماری: WSGI در مقابل ASGI
برای تسلط بر Channels، شما باید ابتدا تغییر پروتکل زیربنایی را درک کنید. برنامههای استاندارد Django روی WSGI اجرا میشوند که همگام و بدون حالت (stateless) است. هر درخواست HTTP پردازش، پردازش و سپس قطع میشود. با این حال، WebSockets به یک اتصال پایدار نیاز دارند که در طول تعامل باز بماند.
Django Channels، Django را در یک سرور ASGI مانند Uvicorn یا Daphne پیچیده است و به آن اجازه میدهد WebSockets، HTTP/2 و long-polling را در کنار درخواستهای HTTP استاندارد مدیریت کند. Django 5.0 این یکپارچگی را با پشتیبانی بهتر از async در ابزارهای هسته بهبود میبخشد و انتقال را برای توسعهدهندگانی که قبلاً با کتابخانه asyncio پایتون آشنا هستند، هموارتر میکند.
راهاندازی محیط شما
قبل از غرق شدن در کد، مطمئن شوید که یک پروژه Django 5.0 تمیز دارید. شما نیاز به نصب کتابخانه Channels و یک سرور ASGI دارید. برای محیط تولید، Uvicorn به دلیل عملکردش به شدت توصیه میشود.
pip install channels uvicorn gunicorn
در فایل settings.py خود، باید 'channels' را به INSTALLED_APPS خود اضافه کنید و برنامه ASGI را پیکربندی کنید. این به Django میگوید که از Channels به عنوان نقطه ورود برای اتصالات ورودی استفاده کند.
# settings.py
INSTALLED_APPS = [
# ...
'channels',
]
ASGI_APPLICATION = 'myproject.asgi.application'
ساخت یک Consumer برای WebSocket
در اکوسیستم Django، یک handler برای WebSocket به نام "Consumer" شناخته میشود. Consumerها مشابه نماهای (Views) Django هستند اما ذاتاً ناهمگام (async) میباشند. بیایید یک consumer ساده ایجاد کنیم که یک اتصال WebSocket را بپذیرد و پیامها را به مشتری بازگرداند.
فایلی به نام consumers.py را در دایرکتوری اپلیکیشن خود ایجاد کنید:
# consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = 'general'
self.room_group_name = f'chat_{self.room_name}'
# Join room group
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
async def disconnect(self, close_code):
# Leave room group
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
# Receive message from WebSocket
async def receive(self, text_data):
text_data_json = json.loads(text_data)
message = text_data_json['message']
# Send message to room group
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'message': message
}
)
# Receive message from room group
async def chat_message(self, event):
message = event['message']
# Send message to WebSocket
await self.send(text_data=json.dumps({
'message': message
}))
AsyncWebsocketConsumer یک رابط تمیز برای مدیریت چرخه عمر یک اتصال WebSocket ارائه میدهد. متد connect جایی است که شما کاربران را احراز هویت میکنید یا به اتاقهای خاصی (گروهها) میپیوندید. channel_layer ستون فقرات Channels است و به فرآیندهای مختلف اجازه میدهد با هم ارتباط برقرار کنند.
مسیریابی WebSockets
دقیقاً همانطور که شما URLهای HTTP را به نماها مسیریابی میکنید، باید URLهای WebSocket را به Consumerها مسیریابی کنید. یک فایل routing.py در اپلیکیشن خود ایجاد کنید:
# routing.py
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'ws/chat/(?P\w+)/$', consumers.ChatConsumer.as_asgi()),
]
سپس، در فایل asgi.py پروژه خود، این مسیرها را شامل کنید:
# myproject/asgi.py
import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import chat.routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
chat.routing.websocket_urlpatterns
)
),
})
نتیجهگیری
Django 5.0 و Django Channels یک چارچوب قدرتمند و یکپارچه برای ساخت برنامههای بلادرنگ فولاستک ارائه میدهند. با بهرهگیری از کدهای ناهمگام و لایه کانال، میتوانید ویژگیهای پیچیده مانند اعلانهای زنده، بازیهای چند نفره و ابزارهای مشارکتی را بدون رها کردن مزایای امنیتی و ORM Django بسازید. همانطور که به کاوش ادامه میدهید، در نظر بگیرید که Redis را به عنوان بکاند لایه کانال خود برای مقیاسپذیری در محیطهای تولید یکپارچه کنید. تسلط بر این ابزارها قابلیتهای شما را به عنوان یک توسعهدهنده بکاند پایتون به طور قابل توجهی گسترش خواهد داد.