# 利用 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 都能夠有效管理和傳遞消息。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.