成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Django WebSocket Redis 在線聊天室

ranwu / 3478人閱讀

摘要:它采用了請(qǐng)求響應(yīng)模型。通信請(qǐng)求只能由客戶端發(fā)起,服務(wù)端對(duì)請(qǐng)求做出應(yīng)答處理弊端協(xié)議無(wú)法實(shí)現(xiàn)服務(wù)器主動(dòng)向客戶端發(fā)起消息。如何使用客戶端創(chuàng)建對(duì)象屬性表示連接狀態(tài)可選值表示連接尚未建立。表示連接正在進(jìn)行關(guān)閉。

一言不合就上效果圖演示

項(xiàng)目:http://112.74.164.107:9990/
(復(fù)制此地址到瀏覽器,即可在線體驗(yàn)使用改項(xiàng)目)

1、安裝組建
redis: yum install redis/apt install redis

2、創(chuàng)建虛擬化環(huán)境并進(jìn)入
python3/python -m venv venv
source venvbinactive

3、安裝第三方庫(kù)
pip install -r requirements.txt

4、初始化
python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic

5、啟動(dòng)服務(wù)
gunicorn -w 5 -k gevent -b 0.0.0.0:9990 webchat.wsgi

6、訪問(wèn)
瀏覽器訪問(wèn) http://ip:9990

整個(gè)項(xiàng)目中涉及的思路和知識(shí)點(diǎn)我們?cè)谶@里都一一分解為大家詳細(xì)解說(shuō)如下:

Django 基礎(chǔ)

Django :一個(gè)可以使 Web 開(kāi)發(fā)工作愉快并且高效的 Web 開(kāi)發(fā)框架,能夠以最小的代價(jià)構(gòu)建和維護(hù)高質(zhì)量的 Web 應(yīng)用
框架:軟件開(kāi)發(fā)工程師從日常的重復(fù)勞動(dòng)中總結(jié)出快速的、模塊化的、安全的軟件開(kāi)發(fā)模式
Django 是 Python 開(kāi)發(fā)者的最佳 Web 框架

MVC

ORM

Object Relation Mapping (關(guān)系對(duì)象映射)

用來(lái)把對(duì)象模型表示的對(duì)象映射到基于 SQL 的關(guān)系模型數(shù)據(jù)庫(kù)結(jié)構(gòu)中去

在具體的操作實(shí) 體對(duì)象的時(shí)候,就不 需要再去和復(fù)雜的 SQL 語(yǔ)句打交道,只 需簡(jiǎn)單的操作實(shí)體對(duì) 象的屬性和方法

Mail (通過(guò)郵箱和驗(yàn)證碼方式進(jìn)行用戶登錄驗(yàn)證)

開(kāi)發(fā)者可為使用 Django 提供的 send_mail 函數(shù)發(fā)送郵件
使用方法
配置郵箱(setting.py)

EMAIL_HOST = "smtp-mail.outlook.com"

EMAIL_PORT = 587

EMAIL_HOST_USER = "[email protected]"

EMAIL_HOST_PASSWORD = ‘xxxxxx"

EMAIL_USE_TLS = True

EMAIL_FROM = EMAIL_HOST_USER

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

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

Session & Cookie

實(shí)現(xiàn)用戶認(rèn)證機(jī)制

HTTP 協(xié)議為無(wú)狀態(tài)

Session 存儲(chǔ)在服務(wù)器

Cookie 存儲(chǔ)在客戶端



WebSocket 基礎(chǔ)(實(shí)現(xiàn)服務(wù)端消息主動(dòng)推送客戶端)

是什么?
WebSocket 是 HTML5 開(kāi)始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議

為什么需要?
HTTP 協(xié)議是一種無(wú)狀態(tài)的、無(wú)連接的、單向的應(yīng)用層協(xié)議。它采用了請(qǐng)
求/響應(yīng)模型。通信請(qǐng)求只能由客戶端發(fā)起,服務(wù)端對(duì)請(qǐng)求做出應(yīng)答處理
弊端: HTTP 協(xié)議無(wú)法實(shí)現(xiàn)服務(wù)器主動(dòng)向客戶端發(fā)起消息。

傳統(tǒng)模式下, Web 應(yīng)用程序通過(guò)頻繁的 ajax 請(qǐng)求實(shí)現(xiàn)長(zhǎng)輪詢( 輪詢是在 特定的時(shí)間間隔(如每1秒),由瀏覽器對(duì)服務(wù)器發(fā)出 HTTP 請(qǐng)求,然后由 服務(wù)器返回最新的數(shù)據(jù)給客戶端的瀏覽器)

缺點(diǎn):輪詢的效率低,非常浪費(fèi)帶寬等資源(瀏覽器需要不斷的向服務(wù)器
發(fā)出請(qǐng)求)

如何工作?
Web 瀏覽器和服務(wù)器都必須實(shí)現(xiàn) WebSockets 協(xié)議來(lái)建立和維護(hù)連 接,由于 WebSockets 連接長(zhǎng)期存在,與典型的 HTTP 連接不同,對(duì) 服務(wù)器有重要的影響(任何 WebSockets 服務(wù)器都需要實(shí)現(xiàn)為異步服 務(wù)器,基于多線程或多進(jìn)程的服務(wù)器無(wú)法適用于 WebSockets,因?yàn)?它旨在打開(kāi)連接,盡可能快地處理請(qǐng)求,然后關(guān)閉連接)

在 WebSocket 協(xié)議中, 瀏覽器和服務(wù)器只需要做一個(gè)握手的動(dòng)作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。

如何使用?

客戶端 API (javascript)
1、創(chuàng)建 websocket 對(duì)象
var ws = new WebSocket(url, [protocol] );

2、屬性
ws.readyState 表示連接狀態(tài)
可選值:
0: 表示連接尚未建立。
1: 表示連接已建立,可以進(jìn)行通信。
2: 表示連接正在進(jìn)行關(guān)閉。
3: 表示連接已經(jīng)關(guān)閉或者連接不能打開(kāi)。
ws.bufferedAmount 表示已被 send() 方法放入正在隊(duì)列中等待傳輸,但是還沒(méi)有發(fā) 出的 UTF-8 文本字節(jié)數(shù)

3、事件

open ws.onopen 建立連接時(shí)觸發(fā)

message ws.onmessage 客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā)

error ws.onerror 通信發(fā)生錯(cuò)誤時(shí)觸發(fā)

close ws.onclose 連接關(guān)閉時(shí)觸發(fā)

4、方法

send ws.send() 使用連接發(fā)送數(shù)據(jù)

close ws.close() 關(guān)閉連接

dwebsocket 使用

dwebsocket 模塊為 django 提供了 WebSocket 協(xié)議的實(shí)現(xiàn)

使用

1、安裝
pip install dwebsocket

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

accept_websocket: view 既可處理 websocket 協(xié)議又可處理普通 http協(xié)議

require_websocket: view 只處理 websocket 協(xié)議,拒絕處理普通 http協(xié)議

request.is_websocket 方法用于判斷是否為 websocket 協(xié)議

獲取 websocket 連接對(duì)象

request.websocket 對(duì)象

獲取數(shù)據(jù)

request.websocket.wait 方法, 阻塞性獲取客戶端數(shù)據(jù)

request.websocket.read 方法,非阻塞性獲取客戶端數(shù)據(jù)

發(fā)送數(shù)據(jù)

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

其他

request.websocket.count_messages()

request.websocket.has_messages()

request.websocket.__iter__()

redis 基礎(chǔ)

Redis 是一個(gè)開(kāi)源的,基于內(nèi)存的,可持久化的,K-V 數(shù)據(jù)庫(kù)
用途:

緩存

消息隊(duì)列

發(fā)布訂閱

發(fā)布訂閱:是一種消息通信模式,發(fā)送者(pub)發(fā)送消息,縮 影訂閱者(sub)都可以接收消息并處理

1、在 redis 客戶端中使用

訂閱:subscribe channel

發(fā)布:publish channel message

2、在 python 中使用
redis 模塊

pip install redis

cli = redis.StrictRedis()

訂閱

pubsub = cli.pubsub()

pubsub.subscribe(channel)

pubsub.get_message()

發(fā)布:

cli.publish(channel, message)

代碼解讀——項(xiàng)目啟動(dòng)

代碼結(jié)構(gòu)

app 定義(app.py)

配置(settings.py)

配置訪問(wèn)地址

啟用 app

配置模版路徑

配置時(shí)區(qū)和國(guó)際化

配置靜態(tài)資源路徑

配置郵箱

配置 redis 緩存

代碼解讀——用戶認(rèn)證流程

流程
1、打開(kāi)登錄頁(yè)面

瀏覽器中輸入 http://ip:9990/login/, 瀏覽器發(fā)送 GET 請(qǐng)求到 login/

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

login 視圖 打開(kāi) login.html 模板

2、發(fā)送驗(yàn)證碼

填寫郵箱,點(diǎn)擊發(fā)送驗(yàn)證碼按鈕,瀏覽器發(fā)送 ajax(GET) 請(qǐng)求到 login_code/

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

login 視圖調(diào)用 models 創(chuàng)建并記錄驗(yàn)證碼,同時(shí)發(fā)送郵件給用戶,返回 json 數(shù)據(jù)

3、登錄

填寫驗(yàn)證碼,點(diǎn)擊登陸按鈕,瀏覽器發(fā)送 ajax(POST) 請(qǐng)求到 login/

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

login 視圖調(diào)用 models 驗(yàn)證郵箱和驗(yàn)證碼,返回 json 數(shù)據(jù),當(dāng)驗(yàn)證成功同時(shí)記錄 session 數(shù)據(jù)

路由(url.py)

視圖-view.py

視圖-models.py

視圖-templates/login.html


代碼解讀——websocket 處理流程

流程
創(chuàng)建 websocket 連接到 msg/,同時(shí)注冊(cè) open, error, message 事件

當(dāng)連接創(chuàng)建,調(diào)用 websocket.send 發(fā)送上線消息

用戶填寫消息,點(diǎn)擊按鈕,調(diào)用 websocket.send 方法發(fā)送聊天消息

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

msg 視圖接收和處理 websocket 消息,同時(shí)監(jiān)聽(tīng)和處理 redis 訂閱的 消息

當(dāng)接收到 websocket 消息,發(fā)布消息到 redis 通道

當(dāng)接收到 redis 發(fā)布消息,則發(fā)送到 websocket 客戶端

獲取 websocket 連接和發(fā)送消息(index.html)

路由處理(view.py)

消息顯示處理(index.html)

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




對(duì)此項(xiàng)目有任何問(wèn)題想要交流的加微信,周三會(huì)有一個(gè)針對(duì)此項(xiàng)目的免費(fèi)解說(shuō),當(dāng)然了在此文章留言也可以,但是我可能不常上此社區(qū)看不到不能及時(shí)回復(fù),想要了解的朋友加微信:17801747114

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42800.html

相關(guān)文章

  • django開(kāi)發(fā)-django和tornado的不同

    摘要:中常用的幾個(gè)框架有等,今天來(lái)總結(jié)一下和的不同。本文使用的環(huán)境是。文件可以加載路由信息和項(xiàng)目配置信息,文件負(fù)責(zé)啟動(dòng)項(xiàng)目。以上就簡(jiǎn)單的比較了和幾個(gè)方面的不同,它們各有優(yōu)缺點(diǎn),實(shí)際工作中可以根據(jù)不同的需求選擇不同的框架進(jìn)行開(kāi)發(fā)。 python中常用的幾個(gè)web框架有django, tornado, flask等,今天來(lái)總結(jié)一下django和tornado的不同。工作中django和torna...

    Reducto 評(píng)論0 收藏0
  • 全棧開(kāi)發(fā)——?jiǎng)邮执蛟鞂儆谧约旱闹辈ラg(Vue+SpringBoot+Nginx)

    摘要:經(jīng)過(guò)琢磨,其實(shí)是要考慮安全性的。具體在以下幾個(gè)方面跨域連接協(xié)議升級(jí)前握手?jǐn)r截器消息信道攔截器對(duì)于跨域問(wèn)題,我們可以通過(guò)方法來(lái)設(shè)置可連接的域名,防止跨站連接。 前言 大學(xué)的學(xué)習(xí)時(shí)光臨近尾聲,感嘆時(shí)光匆匆,三年一晃而過(guò)。同學(xué)們都忙著找工作,我也在這里拋一份簡(jiǎn)歷吧,歡迎各位老板和獵手誠(chéng)邀。我們進(jìn)入正題。直播行業(yè)是當(dāng)前火熱的行業(yè),誰(shuí)都想從中分得一杯羹,直播養(yǎng)活了一大批人,一個(gè)平臺(tái)主播粗略估計(jì)就...

    e10101 評(píng)論0 收藏0
  • 實(shí)戰(zhàn) swoole【天室

    摘要:是一個(gè)請(qǐng)求對(duì)象,包含了客戶端發(fā)來(lái)的握手請(qǐng)求信息事件函數(shù)中可以調(diào)用向客戶端發(fā)送數(shù)據(jù)或者調(diào)用關(guān)閉連接事件回調(diào)是可選的當(dāng)服務(wù)器收到來(lái)自客戶端的數(shù)據(jù)幀時(shí)會(huì)回調(diào)此函數(shù)。 前言:了解概念之后就應(yīng)該練練手啦,不然就是巨嬰 有收獲的話請(qǐng)加顆小星星,沒(méi)有收獲的話可以 反對(duì) 沒(méi)有幫助 舉報(bào)三連 代碼倉(cāng)庫(kù) 實(shí)戰(zhàn)swoole【聊天室】 在線體驗(yàn) 準(zhǔn)備工作 需要先看初識(shí)swoole【上】,了解基本的服務(wù)端...

    andycall 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<