摘要:它采用了請求響應模型。通信請求只能由客戶端發起,服務端對請求做出應答處理弊端協議無法實現服務器主動向客戶端發起消息。如何使用客戶端創建對象屬性表示連接狀態可選值表示連接尚未建立。表示連接正在進行關閉。
一言不合就上效果圖演示
項目:http://112.74.164.107:9990/
(復制此地址到瀏覽器,即可在線體驗使用改項目)
1、安裝組建
redis: yum install redis/apt install redis
2、創建虛擬化環境并進入
python3/python -m venv venv
source venvbinactive
3、安裝第三方庫
pip install -r requirements.txt
4、初始化
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic
5、啟動服務
gunicorn -w 5 -k gevent -b 0.0.0.0:9990 webchat.wsgi
6、訪問
瀏覽器訪問 http://ip:9990
整個項目中涉及的思路和知識點我們在這里都一一分解為大家詳細解說如下:
Django 基礎Django :一個可以使 Web 開發工作愉快并且高效的 Web 開發框架,能夠以最小的代價構建和維護高質量的 Web 應用
框架:軟件開發工程師從日常的重復勞動中總結出快速的、模塊化的、安全的軟件開發模式
Django 是 Python 開發者的最佳 Web 框架
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 是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議
為什么需要?
HTTP 協議是一種無狀態的、無連接的、單向的應用層協議。它采用了請
求/響應模型。通信請求只能由客戶端發起,服務端對請求做出應答處理
弊端: HTTP 協議無法實現服務器主動向客戶端發起消息。
傳統模式下, Web 應用程序通過頻繁的 ajax 請求實現長輪詢( 輪詢是在 特定的時間間隔(如每1秒),由瀏覽器對服務器發出 HTTP 請求,然后由 服務器返回最新的數據給客戶端的瀏覽器)
缺點:輪詢的效率低,非常浪費帶寬等資源(瀏覽器需要不斷的向服務器
發出請求)
如何工作?
Web 瀏覽器和服務器都必須實現 WebSockets 協議來建立和維護連 接,由于 WebSockets 連接長期存在,與典型的 HTTP 連接不同,對 服務器有重要的影響(任何 WebSockets 服務器都需要實現為異步服 務器,基于多線程或多進程的服務器無法適用于 WebSockets,因為 它旨在打開連接,盡可能快地處理請求,然后關閉連接)
在 WebSocket 協議中, 瀏覽器和服務器只需要做一個握手的動作,然后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。
如何使用?
客戶端 API (javascript)
1、創建 websocket 對象
var ws = new WebSocket(url, [protocol] );
2、屬性
ws.readyState 表示連接狀態
可選值:
0: 表示連接尚未建立。
1: 表示連接已建立,可以進行通信。
2: 表示連接正在進行關閉。
3: 表示連接已經關閉或者連接不能打開。
ws.bufferedAmount 表示已被 send() 方法放入正在隊列中等待傳輸,但是還沒有發 出的 UTF-8 文本字節數
3、事件
open ws.onopen 建立連接時觸發
message ws.onmessage 客戶端接收服務端數據時觸發
error ws.onerror 通信發生錯誤時觸發
close ws.onclose 連接關閉時觸發
4、方法
send ws.send() 使用連接發送數據
close ws.close() 關閉連接
dwebsocket 使用dwebsocket 模塊為 django 提供了 WebSocket 協議的實現
使用1、安裝
pip install dwebsocket
2、用法
使用 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)都可以接收消息并處理
1、在 redis 客戶端中使用
訂閱:subscribe channel
發布:publish channel message
2、在 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 緩存
流程
1、打開登錄頁面
瀏覽器中輸入 http://ip:9990/login/, 瀏覽器發送 GET 請求到 login/
urls.py 處理 url login/ 到視圖 login
login 視圖 打開 login.html 模板
2、發送驗證碼
填寫郵箱,點擊發送驗證碼按鈕,瀏覽器發送 ajax(GET) 請求到 login_code/
urls.py 處理 url login_code/ 到視圖 login_code
login 視圖調用 models 創建并記錄驗證碼,同時發送郵件給用戶,返回 json 數據
3、登錄
填寫驗證碼,點擊登陸按鈕,瀏覽器發送 ajax(POST) 請求到 login/
urls.py 處理 url login/ 到視圖 login
login 視圖調用 models 驗證郵箱和驗證碼,返回 json 數據,當驗證成功同時記錄 session 數據
路由(url.py)
視圖-view.py
視圖-models.py
視圖-templates/login.html
流程
創建 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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42800.html
摘要:中常用的幾個框架有等,今天來總結一下和的不同。本文使用的環境是。文件可以加載路由信息和項目配置信息,文件負責啟動項目。以上就簡單的比較了和幾個方面的不同,它們各有優缺點,實際工作中可以根據不同的需求選擇不同的框架進行開發。 python中常用的幾個web框架有django, tornado, flask等,今天來總結一下django和tornado的不同。工作中django和torna...
摘要:經過琢磨,其實是要考慮安全性的。具體在以下幾個方面跨域連接協議升級前握手攔截器消息信道攔截器對于跨域問題,我們可以通過方法來設置可連接的域名,防止跨站連接。 前言 大學的學習時光臨近尾聲,感嘆時光匆匆,三年一晃而過。同學們都忙著找工作,我也在這里拋一份簡歷吧,歡迎各位老板和獵手誠邀。我們進入正題。直播行業是當前火熱的行業,誰都想從中分得一杯羹,直播養活了一大批人,一個平臺主播粗略估計就...
摘要:是一個請求對象,包含了客戶端發來的握手請求信息事件函數中可以調用向客戶端發送數據或者調用關閉連接事件回調是可選的當服務器收到來自客戶端的數據幀時會回調此函數。 前言:了解概念之后就應該練練手啦,不然就是巨嬰 有收獲的話請加顆小星星,沒有收獲的話可以 反對 沒有幫助 舉報三連 代碼倉庫 實戰swoole【聊天室】 在線體驗 準備工作 需要先看初識swoole【上】,了解基本的服務端...
閱讀 3170·2021-09-10 10:51
閱讀 3351·2021-08-31 09:38
閱讀 1639·2019-08-30 15:54
閱讀 3129·2019-08-29 17:22
閱讀 3214·2019-08-26 13:53
閱讀 1960·2019-08-26 11:59
閱讀 3283·2019-08-26 11:37
閱讀 3308·2019-08-26 10:47