在线聊天系统设计

核心提示「来源: |Python爬虫与数据挖掘 ID:crawler_python」回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤云想衣裳花想容,春风拂槛露华浓。在线聊天室在如今的互联网是一个很常见的产品,在各类电商的网页客服

"来源:| Python crawler和数据挖掘ID: crawler _ python "

回复“书籍”即可获得从初级到高级Python的10本电子书。

现在

太阳

鸡肉

汤

看到云的明亮的云,想到他们的衣服,看到花的美丽的人来看看。

在线聊天室是当今互联网中非常常见的产品。我们都可以在各种电商的web客服里接触到网聊。还有一个培训机构。只要你一打开他的网页,马上就会弹出一个在线聊天框,防不胜防。

今天周老师给大家带来一个后端Python+前端Vue的小项目教程。

本教程分为三个部分,包括:

第一部分使用Django的传统MTV模式开发并实现了一个在线聊天室的功能。中间部分在第一部分的基础上增加数据存储,实现聊天记录的保存。第二部分用后端Django+前端Vue来改造传统的Web模型开发。非常适合学了Django还不能开始写项目的朋友。

作为第一部分,我们将使用Django的传统开发模式,借助视图和模板开发一个在线聊天室应用程序。

最终效果如下:

去做吧!

创建虚拟环境

为了不与计算机上现有的Python模块冲突,我们创建了一个新的Python虚拟环境:

Python -m venv django3_env进入虚拟环境,然后激活它。

安装依赖库

我们在后端使用Django3框架:

安装Django还有一个重要的依赖库——通道。

Channels封装了Django的原生异步视图支持,使得Django项目不仅可以处理HTTP,还可以处理需要长期连接的协议,如:WebSockets、MQTT、chatbots、业余无线电等。

简言之,它为Django提供了异步和非HTTP处理的能力。

Pip通道因为通道中的一个函数需要使用Redis作为数据通道和缓存,所以我们必须安装Redis及其Python相关的包。

而Redis在Windows上是没有官方支持的,所以这里周老师用Redis的替代品Memurai,作为Redis使用:

安装完成后,它将作为Windows的一项服务在后台启动。

然后安装Redis支持的通道库:

Pipchannels _ redis创建项目

安装完所有的依赖项后,我们开始创建Django项目:

Django-admin启动项目chat_backend,然后进入chat _ backend目录创建一个应用程序:

Python manage.py startapp聊天配置项目

然后我们进行必要的配置,在settings.py文件中执行以下操作。

将频道和聊天添加到Django项目的应用程序列表:

INSTALLED _ APPS =[' django . contrib . admin ',' django.contrib.auth ',' django . content types ',' django.contrib.sessions ',' django.contrib.messages ',Django.contrib.static files ',' channels ',' chat ',]在项目根目录下创建一个名为templates的新文件夹,然后定义HTML模板路径:

TEMPLATES =[{ ' back end ':' django . template . backends . django . django TEMPLATES ',' DIRS': [ base_DIR / 'templates' ],' APP_DIRS': True,' OPTIONS ':{ ' context _ processors ':[' django . template . context _ processors . debug ',' django . template . context _ processors . request ',' django . contrib . auth . context _ processors . auth ',' django . context _ processors . messages ',],},},]

然后指定asgi应用程序:

asgi _ application = " chat _ back end . asgi . application "最后,指定通道使用的数据通道后端。这里,我们使用Redis:

CHANNEL _ LAYERS = { ' default ':{ ' back end ':' channels _ redis . core . redischannellayer ',' CONFIG': {"hosts": [],},},}

启动Redis后,主机地址和端口号被填入显示的默认值。

创建视图

这个“网上聊天室”有两个页面。一个是主页,用来输入房间号和用户名;另一个是聊天室的页面,用来聊天。

我们在聊天应用程序的views.py下创建了两个新的视图函数:

# home defindex:return render)#聊天室def room:room _ name = room _ name username = request . get . getreturnrender)

其中,景观功能指数回归index.html,景观功能室回归room.html。这两个HTML文件需要在templates文件夹中创建。

定义路线

创建函数后,我们将路由绑定到它,在聊天应用下创建一个名为urls.py的新文件,并在其中写入以下内容:

from django.urls导入路径from chat.views导入* # HTTP URL patterns =[path,path]

然后介绍chat_backend文件夹下urls.py文件中聊天应用的url配置:

urlpatterns = [路径,路径),]

到目前为止,项目“在线聊天室”的HTTP部分已经开发完成。

访问主页,将显示下图所示的页面:

我们可以输入房间号和用户名进入房间,进入房间后的页面如下图所示:

但是现在不能网聊,因为我们还没有写网聊的核心部分——WebSocket的后端。

编写WebSocket后端

WebSocket是一种长连接的双向通信协议。通过WebSocket,我们可以在客户端和服务器之间建立实时通信,而不是HTTP,只有客户端发起,服务器响应。

这里,我们使用通道在Django中实现WebSocket。

首先,在聊天应用下创建一个名为consumers.py的新文件,其中我们引入了WebSocket类:

from channels . generic . WebSocket importasyncWebSocketConsumer然后继承这个类,创建一个名为ChatConsumer的新类,并在其中重写web socket的连接、关闭连接、消息接收等方法。代码如下:

class chat consumer:# Connect async def Connect:self . room _ name = self . scope[' URL _ route '][' kwargs '][' room _ name ']self . room _ group _ name = ' chat _ % s ' % self . room _ name #加入聊天室awa本身. channel _ layer . group _ addawa本身. accept # Close async def disconnect:awa本身. channel _ layer . group _ discard # async def receive:data = JSON . loads message = data[' message ']Username ']。channel _ layer . group _ send # received message asyncdefchat _ message:message = event[' message ']Username = event[' Username ']#向Websocket发送消息await self.send)

最后,我们在asgi中重新声明路线。打开chat_backend目录中的asgi.py文件,修改内容如下:

import OS from django . core . asgi import get _ asgi _ application from django . URLs import path from channels . auth import authmiddleware stack from channels . routing import protocol type router,urlrouter from chat . consumers . environ . set default application = protocol type router," websocket": AuthMiddlewareStack),)))})

如上面的代码所示,HTTP由传统的HTTP路由通过get_asgi_application处理,而WebSocket由通道的URLRouter处理。这个项目启动后,我们可以同时支持HTTP访问和WebSocket访问。

连接前端WebSocket

后端提供WebSocket服务,前端需要连接和处理。

我们来看看前端处理。

首先,通过创建WebSocket对象来创建WebSocket连接:

//建立websocket连接const chatSocket = new WebSocket

然后编写各种WebSocket事件的回调函数:

WebSocket连接关闭后的回调函数chat socket . once = function { console . error;};// websocket连接回调函数chat socket . on message = function { const data = JSON . parse;if { if { document . query selector . innerhtml+=;} else { document . query selector . innerhtml+=;} } else { alert } }

这样前端就完成了到后端WebSocket的连接和消息接收。

最后

运行项目,我们可以在网页上进行实时在线聊天。

当然,这个项目仍然存在许多问题,例如:

聊天记录不会被保存,在页面刷新后会消失。无需用户认证和验证,任何人都可以输入房间号和用户名进入聊天室。接下来,让我们继续完善这个“在线聊天室”,敬请期待!

-结束-

 
友情链接
鄂ICP备19019357号-22