Django WebSocket Redis 在線聊天室

一言不合就上效果圖演示
圖片描述javascript

項目:http://112.74.164.107:9990/
(複製此地址到瀏覽器,便可在線體驗使用改項目)html

一、安裝組建
redis: yum install redis/apt install redisjava

二、建立虛擬化環境並進入
python3/python -m venv venv
source venvbinactivepython

三、安裝第三方庫
pip install -r requirements.txtgit

四、初始化
python manage.py makemigrations
python manage.py migrate
python manage.py collectstaticgithub

五、啓動服務
gunicorn -w 5 -k gevent -b 0.0.0.0:9990 webchat.wsgiweb

六、訪問
瀏覽器訪問 http://ip:9990ajax

整個項目中涉及的思路和知識點咱們在這裏都一一分解爲你們詳細解說以下:redis

Django 基礎

Django :一個可使 Web 開發工做愉快而且高效的 Web 開發框架,可以以最小的代價構建和維護高質量的 Web 應用
框架:軟件開發工程師從平常的重複勞動中總結出快速的、模塊化的、安全的軟件開發模式
Django 是 Python 開發者的最佳 Web 框架數據庫

MVC

圖片描述

ORM

Object Relation Mapping (關係對象映射)

  • 用來把對象模型表示的對象映射到基於 SQL 的關係模型數據庫結構中去
  • 在具體的操做實 體對象的時候,就不 須要再去和複雜的 SQL 語句打交道,只 需簡單的操做實體對 象的屬性和方法

圖片描述

Mail (經過郵箱和驗證碼方式進行用戶登陸驗證)

開發者可爲使用 Django 提供的 send_mail 函數發送郵件
使用方法
配置郵箱(setting.py)

  • EMAIL_HOST = 'smtp-mail.outlook.com'
  • EMAIL_PORT = 587
  • EMAIL_HOST_USER = 'imsilence@outlook.com'
  • EMAIL_HOST_PASSWORD = ‘xxxxxx'
  • EMAIL_USE_TLS = True
  • EMAIL_FROM = EMAIL_HOST_USER

發送
send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)

注: django 發送郵件封裝 python smtplib 模塊,smtplib 使用方 法: https://github.com/imsilence/...

Session & Cookie

實現用戶認證機制

  • HTTP 協議爲無狀態
  • Session 存儲在服務器
  • Cookie 存儲在客戶端

圖片描述
圖片描述
圖片描述

WebSocket 基礎(實現服務端消息主動推送客戶端)

是什麼?
WebSocket 是 HTML5 開始提供的一種在單個 TCP 鏈接上進行全雙工通信的協議

爲何須要?
HTTP 協議是一種無狀態的、無鏈接的、單向的應用層協議。它採用了請
求/響應模型。通訊請求只能由客戶端發起,服務端對請求作出應答處理
弊端: HTTP 協議沒法實現服務器主動向客戶端發起消息。

傳統模式下, Web 應用程序經過頻繁的 ajax 請求實現長輪詢( 輪詢是在 特定的時間間隔(如每1秒),由瀏覽器對服務器發出 HTTP 請求,而後由 服務器返回最新的數據給客戶端的瀏覽器)

缺點:輪詢的效率低,很是浪費帶寬等資源(瀏覽器須要不斷的向服務器
發出請求)

如何工做?
Web 瀏覽器和服務器都必須實現 WebSockets 協議來創建和維護連 接,因爲 WebSockets 鏈接長期存在,與典型的 HTTP 鏈接不一樣,對 服務器有重要的影響(任何 WebSockets 服務器都須要實現爲異步服 務器,基於多線程或多進程的服務器沒法適用於 WebSockets,由於 它旨在打開鏈接,儘量快地處理請求,而後關閉鏈接)

在 WebSocket 協議中, 瀏覽器和服務器只須要作一個握手的動做,而後,瀏覽器和服務器之間就造成了一條快速通道。二者之間就直接能夠數據互相傳送。
圖片描述
圖片描述

如何使用?

客戶端 API (javascript)
一、建立 websocket 對象
var ws = new WebSocket(url, [protocol] );

二、屬性
ws.readyState 表示鏈接狀態
可選值:
0: 表示鏈接還沒有創建。
1: 表示鏈接已創建,能夠進行通訊。
2: 表示鏈接正在進行關閉。
3: 表示鏈接已經關閉或者鏈接不能打開。
ws.bufferedAmount 表示已被 send() 方法放入正在隊列中等待傳輸,可是尚未發 出的 UTF-8 文本字節數

三、事件

  • open ws.onopen 創建鏈接時觸發
  • message ws.onmessage 客戶端接收服務端數據時觸發
  • error ws.onerror 通訊發生錯誤時觸發
  • close ws.onclose 鏈接關閉時觸發

四、方法

  • send ws.send() 使用鏈接發送數據
  • close ws.close() 關閉鏈接

dwebsocket 使用

dwebsocket 模塊爲 django 提供了 WebSocket 協議的實現

使用

一、安裝
pip install dwebsocket

二、用法
使用 accept_websocket 或 require_websocket 裝飾器修飾 view

  • accept_websocket: view 既可處理 websocket 協議又可處理普通 http協議
  • require_websocket: view 只處理 websocket 協議,拒絕處理普通 http協議

request.is_websocket 方法用於判斷是否爲 websocket 協議

獲取 websocket 鏈接對象

  • request.websocket 對象

獲取數據

  • request.websocket.wait 方法, 阻塞性獲取客戶端數據
  • request.websocket.read 方法,非阻塞性獲取客戶端數據

發送數據

  • request.websocket.send(message): 發送消息給 websocket 客戶端

其餘

  • request.websocket.count_messages()
  • request.websocket.has_messages()
  • request.websocket.__iter__()

redis 基礎

Redis 是一個開源的,基於內存的,可持久化的,K-V 數據庫
用途:

  • 緩存
  • 消息隊列
  • 發佈訂閱

發佈訂閱:是一種消息通訊模式,發送者(pub)發送消息,縮 影訂閱者(sub)均可以接收消息並處理
圖片描述

圖片描述

一、在 redis 客戶端中使用

  • 訂閱:subscribe channel
  • 發佈:publish channel message

二、在 python 中使用
redis 模塊

  • pip install redis
  • cli = redis.StrictRedis()

訂閱

  • pubsub = cli.pubsub()
  • pubsub.subscribe(channel)
  • pubsub.get_message()

發佈:

  • cli.publish(channel, message)

圖片描述

代碼解讀——項目啓動

代碼結構
圖片描述

app 定義(app.py)
圖片描述

配置(settings.py)

配置訪問地址
圖片描述

啓用 app
圖片描述

配置模版路徑
圖片描述

配置時區和國際化
圖片描述

配置靜態資源路徑
圖片描述

配置郵箱
圖片描述

配置 redis 緩存
圖片描述

代碼解讀——用戶認證流程

流程
一、打開登陸頁面

  • 瀏覽器中輸入 http://ip:9990/login/, 瀏覽器發送 GET 請求到 login/
  • urls.py 處理 url login/ 到視圖 login
  • login 視圖 打開 login.html 模板

二、發送驗證碼

  • 填寫郵箱,點擊發送驗證碼按鈕,瀏覽器發送 ajax(GET) 請求到 login_code/
  • urls.py 處理 url login_code/ 到視圖 login_code
  • login 視圖調用 models 建立並記錄驗證碼,同時發送郵件給用戶,返回 json 數據

三、登陸

  • 填寫驗證碼,點擊登錄按鈕,瀏覽器發送 ajax(POST) 請求到 login/
  • urls.py 處理 url login/ 到視圖 login
  • login 視圖調用 models 驗證郵箱和驗證碼,返回 json 數據,當驗證成功同時記錄 session 數據

路由(url.py)
圖片描述

視圖-view.py
圖片描述

視圖-models.py
圖片描述
圖片描述

視圖-templates/login.html
圖片描述
圖片描述
圖片描述

代碼解讀——websocket 處理流程

流程
建立 websocket 鏈接到 msg/,同時註冊 open, error, message 事件

當鏈接建立,調用 websocket.send 發送上線消息

用戶填寫消息,點擊按鈕,調用 websocket.send 方法發送聊天消息

urls.py 處理 url msg/ 到視圖 msg

msg 視圖接收和處理 websocket 消息,同時監聽和處理 redis 訂閱的 消息

  • 當接收到 websocket 消息,發佈消息到 redis 通道
  • 當接收到 redis 發佈消息,則發送到 websocket 客戶端

獲取 websocket 鏈接和發送消息(index.html)
圖片描述
圖片描述

路由處理(view.py)
圖片描述

消息顯示處理(index.html)
圖片描述

代碼解讀——推出登錄流程

圖片描述
圖片描述
圖片描述
圖片描述

對此項目有任何問題想要交流的加微信,週三會有一個針對此項目的免費解說,固然了在此文章留言也能夠,可是我可能不常上此社區看不到不能及時回覆,想要了解的朋友加微信:17801747114

相關文章
相關標籤/搜索