Django + WebSocket + Redis 在线聊天室题文章

话不多说先上效果图演示

项目:http://112.74.164.107:9990/

1、安装组建

redis: yum install redis/apt install redis

2、创建虚拟化环境并进入

python3/python -m venv venv

source venv\bin\active

3、安装第三方库
pip install -r requirements.txt

4、初始化
python manage.py makemigrations

python manage.py migrate
python manage.py collectstatic

5、启动服务
gunicorn -w 5 -k gevent -b 0.0.0.0:9990 webchat.wsgi

6、访问

浏览器访问http://ip:9990

整个项目中涉及的思路和知识点我们在这里都一一分解为大家详细解说如下:

Django 基础

Django :一个可以使 Web 开发工作愉快并且高效的 Web 开发框架,能够以最小的代价构建和维护高质量的 Web 应用

框架:软件开发工程师从日常的重复劳动中总结出快速的、模块化的、安全的软件开发模式

Django 是 Python 开发者的最佳 Web 框架

MVC

ORM

Object Relation Mapping (关系对象映射)

  • 用来把对象模型表示的对象映射到基于 SQL 的关系模型数据库结构中去
  • 在具体的操作实 体对象的时候,就不 需要再去和复杂的 SQL 语句打交道,只 需简单的操作实体对 象的属性和方法

Mail (通过邮箱和验证码方式进行用户登录验证)

开发者可为使用 Django 提供的 send_mail 函数发送邮件

使用方法

配置邮箱(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

发送

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

注: django 发送邮件封装 python smtplib 模块,smtplib 使用方 法: https://github.com/imsilence/packages/blob/master/python/mailclient.py

Session & Cookie

实现用户认证机制

  • HTTP 协议为无状态
  • Session 存储在服务器
  • Cookie 存储在客户端


WebSocket 基础(实现服务端消息主动推送客户端)

是什么?

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议

为什么需要?

HTTP 协议是一种无状态的、无连接的、单向的应用层协议。它采用了请

求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理

弊端: HTTP 协议无法实现服务器主动向客户端发起消息。

传统模式下, Web 应用程序通过频繁的 ajax 请求实现长轮询( 轮询是在 特定的时间间隔(如每1秒),由浏览器对服务器发出 HTTP 请求,然后由 服务器返回最新的数据给客户端的浏览器)

缺点:轮询的效率低,非常浪费带宽等资源(浏览器需要不断的向服务器

发出请求)

如何工作?

Web 浏览器和服务器都必须实现 WebSockets 协议来建立和维护连 接,由于 WebSockets 连接长期存在,与典型的 HTTP 连接不同,对 服务器有重要的影响(任何 WebSockets 服务器都需要实现为异步服 务器,基于多线程或多进程的服务器无法适用于 WebSockets,因为 它旨在打开连接,尽可能快地处理请求,然后关闭连接)

在 WebSocket 协议中, 浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

如何使用?

客户端 API (javascript)

1、创建 websocket 对象
var ws = new WebSocket(url, [protocol] );

2、属性

ws.readyState 表示连接状态

可选值:

0: 表示连接尚未建立。
1: 表示连接已建立,可以进行通信。
2: 表示连接正在进行关闭。
3: 表示连接已经关闭或者连接不能打开。
ws.bufferedAmount 表示已被 send() 方法放入正在队列中等待传输,但是还没有发 出的 UTF-8 文本字节数

3、事件

  • open ws.onopen 建立连接时触发
  • message ws.onmessage 客户端接收服务端数据时触发
  • error ws.onerror 通信发生错误时触发
  • close ws.onclose 连接关闭时触发

4、方法
send ws.send() 使用连接发送数据

close ws.close() 关闭连接

dwebsocket 使用

dwebsocket 模块为 django 提供了 WebSocket 协议的实现

使用

1、安装
pip install dwebsocket

2、用法

使用 accept_websocket 或 require_websocket 装饰器修饰 view

  • accept_websocket: view 既可处理 websocket 协议又可处理普通 http协议
  • require_websocket: view 只处理 websocket 协议,拒绝处理普通 http协议
    request.is_websocket 方法用于判断是否为 websocket 协议

获取 websocket 连接对象

  • request.websocket 对象

获取数据

  • request.websocket.wait 方法, 阻塞性获取客户端数据
  • request.websocket.read 方法,非阻塞性获取客户端数据

发送数据

  • request.websocket.send(message): 发送消息给 websocket 客户端

其他

  • request.websocket.count_messages()
  • request.websocket.has_messages()
  • request.websocket.iter()

redis 基础

Redis 是一个开源的,基于内存的,可持久化的,K-V 数据库

用途:

  • 缓存
  • 消息队列
  • 发布订阅

发布订阅:是一种消息通信模式,发送者(pub)发送消息,缩 影订阅者(sub)都可以接收消息并处理

1、在 redis 客户端中使用

  • 订阅:subscribe channel
  • 发布:publish channel message

2、在 python 中使用

redis 模块

  • pip install redis
  • cli = redis.StrictRedis()

订阅

  • pubsub = cli.pubsub()
  • pubsub.subscribe(channel)
  • pubsub.get_message()

发布:

  • cli.publish(channel, message)

代码解读——项目启动

代码结构

app 定义(app.py)

配置(settings.py)

  • 配置访问地址
  • 启用 app
  • 配置模版路径
  • 配置时区和国际化
  • 配置静态资源路径
  • 配置邮箱
  • 配置 redis 缓存

代码解读——用户认证流程

流程

1、打开登录页面

  • 浏览器中输入 http://ip:9990/login/, 浏览器发送 GET 请求到 login/
  • urls.py 处理 url login/ 到视图 login
  • login 视图 打开 login.html 模板

2、发送验证码

  • 填写邮箱,点击发送验证码按钮,浏览器发送 ajax(GET) 请求到 login_code/
  • urls.py 处理 url login_code/ 到视图 login_code
  • login 视图调用 models 创建并记录验证码,同时发送邮件给用户,返回 json 数 据

3、登录

  • 填写验证码,点击登陆按钮,浏览器发送 ajax(POST) 请求到 login/
  • urls.py 处理 url login/ 到视图 login
  • login 视图调用 models 验证邮箱和验证码,返回 json 数据,当验证成功同时记录 session 数据

路由(url.py)

视图-view.py

视图-models.py


视图-templates/login.html



代码解读——websocket 处理流程

流程

创建 websocket 连接到 msg/,同时注册 open, error, message 事件

当连接创建,调用 websocket.send 发送上线消息

用户填写消息,点击按钮,调用 websocket.send 方法发送聊天消息

urls.py 处理 url msg/ 到视图 msg

msg 视图接收和处理 websocket 消息,同时监听和处理 redis 订阅的 消息

  • 当接收到 websocket 消息,发布消息到 redis 通道
  • 当接收到 redis 发布消息,则发送到 websocket 客户端

获取 websocket 连接和发送消息(index.html)


路由处理(view.py)

消息显示处理(index.html)

代码解读——推出登陆流程




想要源码的请留言或者私信博主

原文地址:http://blog.51cto.com/51reboot/2328788

时间: 2024-07-29 08:18:51

Django + WebSocket + Redis 在线聊天室题文章的相关文章

django+ajax实现在线聊天室

django+ajax实现在线聊天室 小项目中的一个,就是简单的聊天室 需求: 注册登陆之后才能发言 初始在聊天框中展示最近的消息 发送消息使用ajax,在后台完成消息的存储 使用轮循不断请求get新消息展示在聊天框中 Models 设计聊天消息主题的结构: class Chat(models.Model): sender = models.ForeignKey(User, related_name='has_chats') content = models.TextField() time =

.NET Core 基于Websocket的在线聊天室

什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后就会断开连接. 在没有websocket之前web系统如果要做双工通讯往往使用http long polling技术.http long polling 每次往服务器发送请求后,服务端不会立刻返回信息来结束请求,而是一直挂着直到有数据需要返回,或者等待超时了才会返回.客户端在结束上一次请求后立刻再发

基于Server-Sent Event的简单在线聊天室

一.Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时如果有人回答了我们的问题,知乎就会即时提醒我们,再比如现在电子商务的在线客服功能.这些能大大提高用户体验的功能都是基于Web即时通信实现的. 普通HTTP流程 客户端从服务器端请求网页 服务器作出相应的反应 服务器返回相应到客户端 而由于HTTP请求是无状态的,也就是说每次请求完成后,HTTP链

SignalR实现在线聊天室功能(欢迎、发送、回复、私信、屏蔽)

一.在线聊天室 1.新建解决方案 SignalROnlineChatDemo 2.新建MVC项目 SignalROnlineChatDemo.Web (无身份验证) 3.安装SignalR PM> install-package Microsoft.AspNet.SignalR 4. 创建一个称为 Startup.cs 的新类 1 public class Startup 2 { 3 public void Configuration(IAppBuilder app) 4 { 5 // 有关如何

Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现保存消息,历史消息和用户在线 由于,我这是在一个项目([无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引)的基础上做的,所以使用到的一些借口和数据表,不详细解析,只是介绍一下思路和实现方式,供大家参考 用户登录注册信息 当用户登录之后,我们注册一下用户的信息,我们

Node.js+socket.io在线聊天室

Node.js+socket.io实现在线聊天室,照着这个教程做的,稍加改动即可实现. Node.js:0.10.31 Express:3.* 创建工程chat: 添加几个文件,工程结构如下 代码: package.json: { "name": "application-name", "version": "0.0.1", "private": true, "scripts": { &

Java和WebSocket开发网页聊天室

小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项目简介 WebSocket是HTML5一种新的协议,它实现了浏览器与服务器全双工通信,这里就将使用WebSocket来开发网页聊天室,前端框架会使用AmazeUI,后台使用Java,编辑器使用UMEditor. 二.涉及知识点 网页前端(HTML+CSS+JS)和Java 三.软件环境 Tomcat

分享基于 websocket 网页端聊天室

博客地址:https://ainyi.com/#/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websocket 网页端聊天室 WebSocket 协议是基于 TCP 的一种新的网络协议.它实现了浏览器与服务器全双工 (full-duplex) 通信--允许服务器主动发送信息给客户端. 使用 java 开发后台 需要导入一个jar包:javax.websocket-api-1.0-rc4.jar 后台

SpringBoot+Vue+WebSocket 实现在线聊天

一.前言 本文将基于 SpringBoot + Vue + WebSocket 实现一个简单的在线聊天功能 页面如下: 在线体验地址:http://www.zhengqingya.com:8101 二.SpringBoot + Vue + WebSocket 实现在线聊天 1.引入websocket依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo