Django利用Channels+websocket开发聊天室

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、什么是?
2.- ASGI
3,开发聊天室或信息推送
前言
数据库系统课程设计要求,要开发一个B2B的售卖平台,本来开发浅薄的我,粗糙又基础的完成了一些基本的功能,想要开发一个单独的一对一聊天的功能(类似于微信这类),查阅了不少资料,依旧没思路,但是却知晓了服务器推送信息和聊天室的开发,记个笔记 。
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是?
1,的诞生背景:网站为了实现推送技术,用的基本是轮询,轮询是基于浏览器不断对服务器发出HTTP请求,服务器范围最新数据给客户端浏览器,这种模式缺点明显,带宽浪费严重,在这种背景下,HTML5诞生了协议,能更好的节省服务器资源并实现通讯 。
2,特点:是单个TCP连接上的全双工通信,浏览器和服务器只需要完成一次握手,就可以创建持久性的连接,实现数据的双向传输 。
2.- ASGI
1,WSGI: Web,就是Web服务器网关接口,主要是规范了Web服务器和Web应用之间的交互,WSGI将分成了三类,服务器,APP,中间件 。服务器就是用来监听某端口,APP用来调用某个函数,而中间件则位于两者中间,相当于一道门,起审核承接等作用 。但是WSGI始终是为同步世界编写的,无法编写异步对象 。因此,ASGI诞生了 。
2,ASGI:Async Sever,说白了,就是相当于WSGI+异步功能,而要调用,就需要使用ASGI接口 。
3,开发聊天室或信息推送
第一步:下载模块
pip
第二步:创建项目
-admin
创建后会看到.0以后自存在asgi.py文件
第三步:创建一个APP应用
.py
第四步:进入.py模块,进行配置
首先在添加和
【Django利用Channels+websocket开发聊天室】然后添加再在中添加ASGI应用
第五步:在创建的APP中创建.py文件以及进入asgi.py模块进行修改如下:
import osfrom django.core.asgi import get_asgi_applicationfrom channels.routing import ProtocolTypeRouter, URLRouterfrom websocket_demo import routingos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'web_socket.settings')application = ProtocolTypeRouter({"http": get_asgi_application(),"websocket": URLRouter(routing.websocket_urlpatterns),})
图中代码很容易理解:将服务器的请求分成了两类,http请求则走默认的asgi APP流程,是请求则进入URL路由,即创建的.py文件
第六步,在的APP中views视图下创建chat.py并且配置.py的文件:
from django.urls import re_pathfrom websocket_demo.views import chatwebsocket_urlpatterns = [re_path(r'chat/(?P\w+)/$', chat.ChatConsumer.as_asgi()),]
使用正则路径匹配chat/数字/的路径,是则进入chat.py文件中的函数
第七步,在urls.py中配置路由,指向中的chat.py文件
from django.urls import path, includefrom websocket_demo.views import chaturlpatterns = [path('index/', chat.chat)]
第八步,编写chat.py文件的内容如下:
from django.shortcuts import renderfrom channels.generic.websocket import WebsocketConsumerfrom channels.exceptions import StopConsumerfrom asgiref.sync import async_to_syncfrom datetime import datetimedef chat(request):group_number = request.GET.get('num')return render(request, 'web/index.html', context)class ChatConsumer(WebsocketConsumer):def websocket_connect(self, message):self.accept()group = self.scope['url_route']['kwargs'].get("group")async_to_sync(self.channel_layer.group_add)(group, self.channel_name)def websocket_receive(self, message):group = self.scope['url_route']['kwargs'].get("group")async_to_sync(self.channel_layer.group_send)(group, {"type": "chat", 'message': message})def chat(self, event):text = event['message']['text']self.send(text)def websocket_disconnect(self, message):group = self.scope['url_route']['kwargs'].get("group")async_to_sync(self.channel_layer.group_discard)(group, self.channel_name)print('客户端断开连接了')raise StopConsumer()