راه‌اندازی وب‌سوکت با فریم‌ورک جانگو (Django)

در این مقاله سعی شده است تا پروتکل وب‌سوکت که یکی از محبوب‌ترین پروتکل‌های ارتباطی در نرم‌افزارهای مدرن است معرفی شود. در ادامه سناریوی راه‌اندازی یک وب‌سوکت سرور با استفاده از فریم ورک محبوب جانگو (Django) ارائه شده است. برای این کار از ماژول django-channels استفاده خواهد شد. در صورتی که با فریم‌‌ورک جانگو آشنا نیستید و می‌خواهید برای اولین بار آن را نصب و استفاده کنید، می‌توانید مقاله نصب فریم‌ورک جانگو بر روی Ubuntu در مجله Host2Host را مطالعه فرمایید.

در انتهای این مقاله شما …

  • با مفاهیم اولیه وب‌سوکت آشنا شده‌اید.
  • یک وب‌سوکت سرور ساده با استفاده از جانگو و ماژول Django Channels ایجاد خواهید کرد.
  • یک ارتباط ساده بین جانگو و سرور redis برقرار خواهید کرد.
  • یک سناریوی تست این وب‌سوکت را ایجاد می‌کنید.

چرا وب‌سوکت؟

وب سوکت یک پروتکل ارتباطی کامپیوتری است که باعث ایجاد یک ارتباط دو طرفه بر روی یک ارتباط TCP می‌شود. این پروتکل که در معماری وب مورد استفاده قرار می‌گیرد، بر خلاف پروتکل HTTP که به صورت Client/Server عمل کرده و تنها کاربران می‌توانند با درخواست به سرور و دریافت پاسخ، اطلاعات خود در سمت Client را به روز رسانی نمایند، در این پروتکل هر دو طرف می‌توانند برای یکدیگر پیام ارسال نموده و به هم اطلاع‌رسانی کنند.

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

یک مثال خیلی خوب دیگر از کاربرد وب سوکت می‌توان به نرم‌افزارهای چت اشاره کرد. که یکی از پروتکل‌های محبوب برای ایجاد این دسته نرم‌افزارها وب سوکت است. به این صورت که کاربران از طریق وب سوکت متصل هستند و پیام‌های رد و بدل شده همگی از این طریق ارسال می‌شوند.

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

همان‌طور که اشاره شد برای راه‌اندازی این سرور از فریم‌ورک جانگو و ماژول django-channels استفاده خواهد شد. ابتدا باید مقدمات پروژه را ایجاد کنیم. برای این‌کار همانطور که در نصب فریم‌ورک جانگو بر روی Ubuntu اشاره شده عمل کرده و یک محیط مجازی برای نصب ماژول‌‌ها ایجاد می‌کنیم:

$ mkdir host2host-django-channel
$ cd host2host-django-channel
$ python3.6 -m venv env
$ source env/bin/activate
(env)$

حال باید پکیج‌های Django, Django Channels و ASGI Redis را نصب کرده و یک پروژه جدید جانگو ایجاد کنید.

(env)$ pip install django==1.11 channels==1.0.2 asgi_redis==1.0.0
(env)$ django-admin startproject websocket_server
(env)$ cd websocket_server
(env)$ python manage.py startapp example
(env)$ python manage.py migrate

در مرحله بعدی باید ‍redis را نصب نمایید. در اوبونتو خیلی راحت با استفاده از دستور زیر می‌توانید این کار را انجام دهید:

$ sudo apt-get install redis-server

پس از نصب مطمئن شوید که redis به درستی راه‌اندازی شده و بر روی پورت 6379 در حال اجرا است. حال در تنظیمات پروژه باید نرم‌افزارهایی که نصب کرده اید را تعریف کنید:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'channels',
    'example',
]

حال باید تنظیمات ماژول django-channel را اضافه کنید:

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'asgi_redis.RedisChannelLayer',
        'CONFIG': {
            'hosts': [('localhost', 6379)],
        },
        'ROUTING': 'websocket_server.routing.channel_routing',
    }
}

همانطور که در این تنظیمات مشاهده می‌کنید این ماژول از Redis برای تبادل پیام‌های خود استفاده می‌کند.

درباره وب‌سوکت‌های 101

در حالت عادی جانگو از پروتکل HTTP برای تبادل پیام‌های خود بین کلاینت و سرور استفاده می‌کند:

  • ابتدا کاربر یک درخواست HTTP برای سرور ارسال می‌کند.
  • جانگو این درخواست را پارس نموده، URL را استخراج کرده و تابع و کلاس‌ متناسب با آن را پیدا در views پیدا می‌کند.
  • در view این درخواست پردازش شده و یک پاسخ HTTP برای کلاینت ارسال می‌شود.

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

دقت شود که به دلیل اینکه پروتکل وب سوکت با HTTP متفاوت است درخواست‌ها به این پروتکل باید با ws:// شروع شوند.

مصرف‌کننده‌ها (Cosumer) و گروه‌ها (Groups)

ابتدا باید مصرف‌کننده‌ها را تعریف کنید. این consumerها در واقع ارتباطات بین سرور و کلاینت‌ها را مدیریت مدیریت می‌نمایند. به همین دلیل در app مورد نظر خود یک فایل consumer.py ایجاد کنید. که در این مثال مسیر آن به صورت زیر خواهد بود:

host2host-django-channel/example/consumer.py

و کدهای زیر را در داخل این فایل کپی کنید:

from channels import Group

def ws_connect(message):
    Group('users').add(message.reply_channel)

def ws_disconnect(message):
    Group('users').discard(message.reply_channel)

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

مرحله بعدی تنظیم routeها است که تقریبا معادل urls.py در جانگو هستند. حال فایل زیر را در routing.py قرار دهید.

from channels.routing import route
from example.consumers import ws_connect, ws_disconnect


channel_routing = [
    route('websocket.connect', ws_connect),
    route('websocket.disconnect', ws_disconnect),
]

ادامه آموزش به زودی اضافه خواهد شد…

برچسب‌ها::