Django Channels | Bangla
Develop Asynchronous / Real Time Application with Django Channels
আসসালামুআলাইকুম।
জ্যাঙ্গোর অনেক সুন্দর কিছু ফিচার যেগুলো জ্যাঙ্গোকে অনেক বেশি সমৃদ্ধ করেছে সেগুলোর মধ্যে Django Channels এর কথা না বললেই নয়। জ্যাঙ্গো দিয়ে IoT বেসড কিছু ওয়েব সার্ভার বানানোর সময় Django Channels এর সাথে আমার পরিচয় ঘটে। তারই ধারাবাহিকতায় Django Channels নিয়ে বেসিক কিছু লিখার চেষ্টা করছি
অফিসিয়াল ভাবে বললে-
“Channels is a project that takes Django and extends its abilities beyond HTTP — to handle WebSockets, chat protocols, IoT protocols, and more. It’s built on a Python specification called ASGI.”
অর্থাৎ Asynchronously Real Time Update এর জগৎ এ Django Channels খুবই ইফিসিয়েন্ট একটা জিনিস!
HTTP প্রটোকলের মাধ্যমে সাধারণ ক্লায়েন্ট-সার্ভার Handshake পর সার্ভার, ক্লায়েন্টকে কিছু একটা রিসপন্স দিয়ে কানেকশন ক্লোজ করে দেয়। পুনরায় Server এর সাথে Client এর Connection এর জন্য পুনরায় Handshake এর প্রয়োজন পড়ে যেটা বেশ কিছু সময় সাপেক্ষ ব্যাপার যা Continuous Update বা Communication এর জন্য মোটেও ভালো কোন প্রটোকল নয়।
অপর দিকে আমরা যদি Websocket এর কথা চিন্তা করি তাহলে, Websocket protocol এর মাধ্যমে প্রথমেই Client-Server Handshake হয়। এর পর ক্লায়েন্ট যতক্ষণ না Connection Close করে দেয়, ততক্ষণ পর্যন্ত Client-Server কানেকশন Open থাকে।
অথবা আমরা যদি Pub-Sub Type Communication এর কথা চিন্তা করি (যেমন IoT এর জন্য MQTT protocol), তাহলেও Asynchronously Client-Server কমিউনেকশনের প্রয়োজন পড়ে।
এরকমভাবে Chat এপ্লিকেশন থেকে শুরু করে যেকোন Real-Time বেসজড অ্যাপ্লিকেশনের জন্য Django Channels খুবই ইফেক্টিভ হতে পারে যেটা Django Based অ্যাপ্লিকেশনগুলোর Flexilibility অনেক বাড়িয়ে দিয়েছে।
এখন Django Channels এর কিছু Working Procedure নিয়ে আলোচনা করা যাক।
Django Channels বুঝতে হলে Channel, Channel Layer, Group, Consumer, Routing নিয়ে আগে কিছুটা ধারণা নিতে হবে।
Channel: Channel কে তুলনা করা যায় অনেকটা পোস্ট অফিসের মতো। যেখানে সকল পার্সেল এসে জমা হয়। Django Channels এর মধ্যেই মূলত ডাটা প্রসেস হয়।
Channel Layer: Channel যদি পোস্ট অফিস হয়, তাহলে Channel Layer হচ্ছে পিয়ন। অর্থাৎ সকল ডাটা Channel Layer দিয়েই নির্দিষ্ট Channel এ পৌঁছায়। Channel Layer কে অনেকটা Broker এর সাথে তুলনা করা যায়। Channel Layer হিসেবে Redis ব্যবহার করা যেতে পারে যার মাধ্যমে মেসেজ বা ডাটা Channel গুলোতে পাস হবে।
Get MSI Shafik’s stories in your inbox
Join Medium for free to get updates from this writer.
Consumer: Consumer কে আমরা Django আর Class Based View এর সাথে তুলনা করতে পারি। কিন্তু এটা CBV এর মতো এতো হাই লেভেল কোন ক্লাস নয়। Consumer এর বেস দুটি ক্লাস হচ্ছে SyncConsumer এবং AsyncConsumer। View এর request অবজেক্টের মতো Consumer ক্লাসেও একটা scope নামে একটা অবজেক্ট আছে যেটা মূলত রিকুয়েস্টর প্রাথমিক তথ্যগুলো সংরক্ষণ করে। Consumer এর কিছু সাব-ক্লাস রয়েছে-
- WebsocketConsumer and AsyncWebsocketConsumer
- JsonWebsocketConsumer
- AsyncJsonWebsocket Consumer
- AsyncHttpConsumer
Group: এটা একটা খুব কমন বিষয় যে ডাটা বা মেসেজ কোন একজন সিঙ্গেল Consumer এর কাছে সেন্ড না করে সেটা একটি নির্দিষ্ট user এর সাথে রিলেটেড সকল consumer এর কাছে সেন্ড করা। সো, সকল consumer entities কেই গ্রুপ বলা হয়। আরেকটু স্পেসিফিক ভাবে তুলনা করলে এটাকে Pub-Sub সিস্টেমের Topic এর সাথে তুলনা করা যায়।
Routing: Client Request কে নির্দিষ্ট Consumer এর মধ্যে রাউট করার জন্য Protocol (HTTP or Websocket), URLs বা Channel Names ব্যবহার করা যায়।
আমরা এখন Consumer Class কেমন হয়, সেটা দেখার চেষ্টা করবো-
class TestConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
await self.accept()
async def receive_json(self, content, **kwargs):
message_type = content.get('type')
elif message_type == 'echo.message':
await self.echo_message(content) async def echo_message(self, message):
await self.send_json(message) async def disconnect(self, code):
await super().disconnect(code)
১. connect: Client Request প্রথমেই Consumer ক্লাসের connect মেথড execute করে। সো, এখানে user এর উপর ভিত্তি করে তাকে বিভিন্ন Group এ যুক্ত করে দেয়া হয়। এর জন্য -
await self.channel_layer.group_add(
group=<group name>,
channel=self.channel_name
)উপরের এই মেথডটি ব্যবহার করা হয়। অথবা চাইলে আনঅথেনটিক ইউজারের জন্য কানেকশন রিজেক্ট করে দেয়া হয়।
২. receive_json: এই মেথডেই মূলত ক্লায়েন্টর সেন্ড করা সকল মেসেজ রিসিভ করা হয়, এবং মেসেজের টাইপ অনুসারে অন্য যেকোন অ্যাকশন এক্সিকিউট করা হয়( ডিফল্ট কনভেনশন হচ্ছে মেসেজের জন্য একটা type কিওয়ার্ড ব্যবহার করা)। যেমন এখানে মেসেজ এর type — “echo.message” হওয়ার কারণে echo_message মেথডটি কল করা হচ্ছে। echo_message মেথডটি ক্লায়েন্টকে মেসেজটি self.send_json(message) এর মাধ্যমে রিসপন্স দিচ্ছে। এখানে আমরা চাইলে group_send মেথডের মাধ্যমে এটা নির্দিষ্ট একটা consumer group এর সকলকে সেন্ড করতে পারতাম-
await self.channel_layer.group_send(group=<group_name>, message={
'type': <type>,
'data': <data>
})৩. disconnect: এই মেথডটা মূলত ক্লায়েন্ট কানেকশন ক্লোজ হওয়ার পর কল হয়। এর মধ্যে সাধারণ ক্লায়েন্টকে চ্যানেলের গ্রুপ থেকে discard করে দেয়া হয়। যেমন-
await self.channel_layer.group_discard(
group=<group>,
channel=self.channel_name
)এই হচ্ছে মোটামুটি Django Channels সম্পর্কে বেসিক ধারণা। Django Channel সম্পর্কে বিস্তারিত জানার জন্য অফিসিয়াল ডকুমেন্টেশন পড়া যেতে পারে অথবা আরেকটু জানার জন্য আমাকে কফির দাওয়াত দেয়া যেতে পারে। ;P
ধন্যবাদ :) আসসালামুালাইকুম।





