最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue+django實現(xiàn)一對一聊天功能的實例代碼

 更新時間:2019年07月17日 13:49:32   作者:凡沸  
這篇文章主要介紹了vue+django實現(xiàn)一對一聊天功能,主要是通過websocket,由于Django不支持websocket,所以我使用了django-channels。,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下

vue+django實現(xiàn)一對一聊天和消息推送的功能。主要是通過websocket,由于Django不支持websocket,所以我使用了django-channels。考慮到存儲量的問題,我并沒有把聊天信息存入數(shù)據(jù)庫,服務端的作用相當于一個中轉(zhuǎn)站。我只講述實現(xiàn)功能的結(jié)構(gòu)性代碼,具體的實現(xiàn)還請大家看源代碼。

前端聊天界面

前端消息提醒界面

后端代碼

效果展示

實現(xiàn)過程

后端

首先,我們需要先定義websocket的兩條連接路徑。ws/chat/xxx/(xxx指代聊天組)這條路徑是當聊天雙方都進入同一個聊天組以后,開始聊天的路徑。push/xxx/(xxx指代用戶名)這條是指當有一方不在聊天組,另一方的消息將通過這條路徑推送給對方。ws/chat/xxx/只有雙方都進入聊天組以后才開啟,而push/xxx/是自用戶登錄以后,直至退出都開啟的。

websocket_urlpatterns = [
 url(r'^ws/chat/(?P<group_name>[^/]+)/$', consumers.ChatConsumer),
 url(r'^push/(?P<username>[0-9a-z]+)/$', consumers.PushConsumer),
]

我們采用user_a的id加上下劃線_加上user_b的id的方式來命名聊天組名。其中id值從小到大放置,例如:195752_748418。當用戶通過ws/chat/group_name/的方式向服務端請求連接時,后端會把這個聊天組的信息放入一個字典里。當連接關(guān)閉時,就把聊天組從字典里移除。

class ChatConsumer(AsyncJsonWebsocketConsumer):
 chats = dict()
 async def connect(self):
 self.group_name = self.scope['url_route']['kwargs']['group_name']
 await self.channel_layer.group_add(self.group_name, self.channel_name)
 # 將用戶添加至聊天組信息chats中
 try:
  ChatConsumer.chats[self.group_name].add(self)
 except:
  ChatConsumer.chats[self.group_name] = set([self])
 #print(ChatConsumer.chats)
 # 創(chuàng)建連接時調(diào)用
 await self.accept()
 async def disconnect(self, close_code):
 # 連接關(guān)閉時調(diào)用
 # 將關(guān)閉的連接從群組中移除
 await self.channel_layer.group_discard(self.group_name, self.channel_name)
 # 將該客戶端移除聊天組連接信息
 ChatConsumer.chats[self.group_name].remove(self)
 await self.close()

接著,我們需要判斷連接這個聊天組的用戶個數(shù)。當有兩個用戶連接這個聊天組時,我們就直接向這個聊天組發(fā)送信息。當只有一個用戶連接這個聊天組時,我們就通過push/xxx/把信息發(fā)給接收方。

 async def receive_json(self, message, **kwargs):
 # 收到信息時調(diào)用
 to_user = message.get('to_user')
 # 信息發(fā)送
 length = len(ChatConsumer.chats[self.group_name])
 if length == 2:
  await self.channel_layer.group_send(
  self.group_name,
  {
   "type": "chat.message",
   "message": message.get('message'),
  },
  )
 else:
  await self.channel_layer.group_send(
  to_user,
  {
   "type": "push.message",
   "event": {'message': message.get('message'), 'group': self.group_name}
  },
  )
 async def chat_message(self, event):
 # Handles the "chat.message" event when it's sent to us.
 await self.send_json({
  "message": event["message"],
 })
# 推送consumer
class PushConsumer(AsyncWebsocketConsumer):
 async def connect(self):
 self.group_name = self.scope['url_route']['kwargs']['username']
 await self.channel_layer.group_add(
  self.group_name,
  self.channel_name
 )
 await self.accept()
 async def disconnect(self, close_code):
 await self.channel_layer.group_discard(
  self.group_name,
  self.channel_name
 )
 # print(PushConsumer.chats)
 async def push_message(self, event):
 print(event)
 await self.send(text_data=json.dumps({
  "event": event['event']
 }))

前端

前端實現(xiàn)websocket就比較簡單了。就是對websocket進行初始化,定義當websocket連接、關(guān)閉和接收消息時要執(zhí)行哪些動作。

<script>
 export default {
 name : 'test',
 data() {
 return {
 websock: null,
 }
 },
 created() {
 this.initWebSocket();
 },
 destroyed() {
 this.websock.close() //離開路由之后斷開websocket連接
 },
 methods: {
 initWebSocket(){ //初始化weosocket
 const wsuri = "ws://127.0.0.1:8080";
 this.websock = new WebSocket(wsuri);
 this.websock.onmessage = this.websocketonmessage;
 this.websock.onopen = this.websocketonopen;
 this.websock.onerror = this.websocketonerror;
 this.websock.onclose = this.websocketclose;
 },
 websocketonopen(){ //連接建立之后執(zhí)行send方法發(fā)送數(shù)據(jù)
 let actions = {"test":"12345"};
 this.websocketsend(JSON.stringify(actions));
 },
 websocketonerror(){//連接建立失敗重連
 this.initWebSocket();
 },
 websocketonmessage(e){ //數(shù)據(jù)接收
 const redata = JSON.parse(e.data);
 },
 websocketsend(Data){//數(shù)據(jù)發(fā)送
 this.websock.send(Data);
 },
 websocketclose(e){ //關(guān)閉
 console.log('斷開連接',e);
 },
 },
 }
</script>

參考文章

Django Channels 實現(xiàn)點對點實時聊天和消息推送

Vue中使用websocket的正確使用方法

總結(jié)

以上所述是小編給大家介紹的vue+django實現(xiàn)一對一聊天功能的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • vue無法加載文件C:\xx\AppData\Roaming\npm\vue.ps1系統(tǒng)禁止運行腳本

    vue無法加載文件C:\xx\AppData\Roaming\npm\vue.ps1系統(tǒng)禁止運行腳本

    這篇文章主要介紹了vue?:?無法加載文件?C:\xx\AppData\Roaming\npm\vue.ps1...系統(tǒng)上禁止運行腳本問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • VUE中使用滾動組件-vueSeamlessScroll

    VUE中使用滾動組件-vueSeamlessScroll

    這篇文章主要介紹了VUE中使用滾動組件-vueSeamlessScroll,需要的朋友可以參考下
    2023-10-10
  • vue+highcharts實現(xiàn)3D餅圖效果

    vue+highcharts實現(xiàn)3D餅圖效果

    這篇文章主要為大家詳細介紹了vue+highcharts實現(xiàn)3D餅圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 使用淘寶鏡像cnpm安裝Vue.js的圖文教程

    使用淘寶鏡像cnpm安裝Vue.js的圖文教程

    今天小編就為大家分享一篇使用淘寶鏡像cnpm安裝Vue.js的圖文教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • vue使用Google地圖的實現(xiàn)示例代碼

    vue使用Google地圖的實現(xiàn)示例代碼

    這篇文章主要介紹了vue使用Google地圖的實現(xiàn)示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • vue+axios新手實踐實現(xiàn)登陸的示例代碼

    vue+axios新手實踐實現(xiàn)登陸的示例代碼

    這篇文章主要介紹了vue+axios新手實踐實現(xiàn)登陸的示例代碼,實現(xiàn)了登陸攔截,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • vue解決跨域問題的幾種常用方法(CORS)

    vue解決跨域問題的幾種常用方法(CORS)

    在Vue中解決跨域問題有多種方法,今天通過本文給大家介紹幾種比較常見的方法,對vue解決跨域問題感興趣的朋友跟隨小編一起看看吧
    2023-05-05
  • vue2中l(wèi)ess的安裝以及使用教程

    vue2中l(wèi)ess的安裝以及使用教程

    less是css預處理器,對原先css進行了擴展和補充,下面這篇文章主要給大家介紹了關(guān)于vue2中l(wèi)ess的安裝以及使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • 關(guān)于Vue3父子組件emit參數(shù)傳遞問題(解決Vue2this.$emit無效問題)

    關(guān)于Vue3父子組件emit參數(shù)傳遞問題(解決Vue2this.$emit無效問題)

    相信很多人在利用事件驅(qū)動向父組件扔東西的時候,發(fā)現(xiàn)原來最常用的this.$emit咋報錯了,竟然用不了了,下面通過本文給大家分享關(guān)于Vue3父子組件emit參數(shù)傳遞問題(解決Vue2this.$emit無效問題),需要的朋友可以參考下
    2022-07-07
  • Vue中v-for的9種使用案例總結(jié)大全

    Vue中v-for的9種使用案例總結(jié)大全

    v-for是vue的循環(huán)指令,作用是遍歷數(shù)組(對象)的每一個值,這篇文章主要給大家介紹了關(guān)于Vue中v-for的9種使用案例的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12

最新評論

汉川市| 玉门市| 西乌珠穆沁旗| 昭苏县| 舒城县| 浏阳市| 郎溪县| 宁阳县| 沐川县| 得荣县| 巴楚县| 恩平市| 错那县| 丹寨县| 钟祥市| 丰顺县| 永修县| 通辽市| 共和县| 青河县| 梅州市| 闻喜县| 昌宁县| 孟州市| 无极县| 易门县| 五大连池市| 沈丘县| 奇台县| 淳安县| 揭东县| 城市| 衡阳市| 饶阳县| 咸丰县| 德令哈市| 琼海市| 正蓝旗| 婺源县| 梅州市| 长岭县|