"来源:| 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的连接和消息接收。

最后
运行项目,我们可以在网页上进行实时在线聊天。
当然,这个项目仍然存在许多问题,例如:
聊天记录不会被保存,在页面刷新后会消失。无需用户认证和验证,任何人都可以输入房间号和用户名进入聊天室。接下来,让我们继续完善这个“在线聊天室”,敬请期待!
-结束-


