---
# System prepended metadata

title: 利用 Django Channels 讓 Django 兼容 Websockets
tags: [django]

---

# 利用 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 都能夠有效管理和傳遞消息。