# 利用 Django Channels 讓 Django 兼容 Websockets 第一篇 ## 介紹 Django Channels 是 Django 的一個延伸套件,它使開發人員能夠輕鬆構建即時應用程式。在這篇指南中,將解釋如何下載 Channels 並設定 Django 使其運行順暢。 ## Channels 的下載與設定 ### 1. 下載 Channels ```bash= poetry add channels["daphne"] ``` daphne 是 Channels 預設的 ASGI server,可以自行更換成其他。(例如 Uvicorn, Hypercorn)。 詳細可以參閱說明:https://channels.readthedocs.io/en/latest/ ### 2. settings.py 的設定 首先在 Installed_apps 加上 `daphne`,謹記一定要在 `django.contrib.staticfiles` 前。或是像是官方建議一樣,直接放在最前面就好。 ```pyton= INSTALLED_APPS = [ # 👇 加在這裡 "daphne", 'django.contrib.admin', # .... # ... # .. # . 'myapp', ] ``` #### 接著寫下 ASGI_APPLICATION ```pyton= ASGI_APPLICATION = 'myproject.asgi.application' #WSGI_APPLICATION = 'myproject.wsgi.application' ``` #### 接著設定 Channel Layer ```python= CHANNEL_LAYERS = { 'default': { 'BACKEND': "channels.layers.InMemoryChannelLayer" } } ``` 當你在 CHANNEL_LAYERS 設置中定義 'BACKEND': "channels.layers.InMemoryChannelLayer" 並放在 'default' 下時,表示你使用的是 Django Channels 提供的內存通道層,這通常用於開發環境。 在正式環境中,通常會使用更可靠的通道層後端,比如 Redis 或 RabbitMQ。這些工具能夠更好地處理大量的並發連接與消息傳遞。 這些設置更改是為了將 Django Channels 融合到 Django 中,從而通過 WebSocket 連接實現即時通訊的功能。 ### 討論 #### Channels 和 Daphne 很嚴格來說, Channels 並不是一個 Django 應用,而是一個拿來製造 Django 應用的框架。這也是為什麼我們不用再 Installed_app 中放入 Channels。但在後續的設定中,許多資料夾都會飲用 Channels 提供的函式與型別。 而 Daphne 作為 ASGI server 並不綁定於 Channels,只要想要實現非同步交流的 Python project 都可以使用它。 #### Channel layers 很嚴格來說,Channels 是不需要 Channel Layers 也可以用得,只不過功能會侷限很多。因為 Channel Layers 著重在實現不同服務之間通信的機制,假如只需要伺服器與一個客戶端的連結,的確用不到。不過這種狀況比較少見,因為用上了 Websocket 通訊機制時,多數強調不同消費者 (consumer) 之間的互動。 Channel Layers 有以下幾個好處: 1. 消息傳遞 (Message Passing) Channel Layer 允許不同的消費者(consumers)之間傳遞消息。這對於像聊天室、即時通知這類需要多個用戶即時互動的應用非常有用。當一個用戶發送消息時,它可以通過 Channel Layer 傳遞給其他消費者。 2. 群組管理 (Group Management) Channel Layer 可將多個消費者組成一個群組,並將消息廣播到整個群組。這對於通知所有用戶或一組特定用戶非常有幫助,例如向聊天室中的所有用戶發送消息,或給訂閱某個頻道的用戶發送通知。 3. 多節點支持 (Multi-node Support) Channel Layer 還可以跨多個服務器實例工作,這意味著它支持分佈式應用程式的通訊。因此,無論應用程式運行在單個還是多個節點上,Channel Layer 都能夠有效管理和傳遞消息。