使用 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)

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

大家对此项目分享有什么疑问的请准备好在本周三晚上我们的 kk 大牛会为大家一一解答。

项目分享人:KK老师

多语言混搭开发工程师,多年 PHP、Python 项目开发经验,曾就职 360、绿盟科技,7年工作经验。擅长于 Web 安全开发、性能优化、分布式应用开发&设计等多方面,51Reboot 金牌讲师。

分享的时间:2018-12-12 21:00-22:00

参与方式:添加小助手wechat 备注:公开课,会拉入直播分享群

原文地址:https://www.cnblogs.com/reboot51/p/10101744.html

时间: 2024-10-16 01:09:50

使用 Django WebSocket Redis 搭建在线即时通讯工具的相关文章

区块链资产交易所搭建IM即时通讯系统开发

区块链资产交易所搭建IM即时通讯系统开发 [本文由源中瑞涂先生编辑/交易所开发VX搜索:ruiec999]随着数字资产交易市场的演进和机构投资者的参与,交易所领域创业面临的合规.安全.专业.透明等问题也逐渐成为其新的竞争力增长点.源中瑞业务涵盖:数字资产交易所开发.场外交易所开发.币币交易所开发.数字资产多币种钱包开发.数字资产抵押系统开发.IM即时通讯系统开发等各类区块链技术系统.(数字资产交易所:jy.ruiec.com)根据18年上半年全球各地交易所数量增长迅速,除传统中心化交易所以外,交

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

WebSocket集成XMPP网页即时通讯1:Java Web Project服务端/客户端Jetty9开发初探

Web 应用的信息交互过程通常是客户端通过浏览器发出一个请求,服务器端接收和审核完请求后进行处理并返回结果给客户端,然后客户端浏览器将信息呈现出来,这种机制对于信息变化不是特别频繁的应用尚能相安无事,但是对于那些实时要求比较高的应用来说,比如说在线游戏.在线证券.设备监控.新闻在线播报.RSS 订阅推送等等,当客户端浏览器准备呈现这些信息的时候,这些信息在服务器端可能已经过时了.所以保持客户端和服务器端的信息同步是实时 Web 应用的关键要素,对 Web 开发人员来说也是一个难题.在 WebSo

tomcat websocket 实现网页在线即时聊天

背景介绍 近一个月完成了公司的一个项目,负责即时聊天部分 寻找了一下,决定使用websocket,要问原因的话,因为tomcat 自带相关消息收发的API,用起来方便 闲话少叙,进入实现步骤 使用工具  java 1.6      tomcat 7.0.27以上版本(以下版本不支持websocket),本人使用的是 7.0.42版本 先概括说一下:(看着迷糊没关系,下面有提供完整源码,可以下载后运行 ,结合效果自行分析) 先写一个,消息处理类,继承 tomcat的catalina.jar的Mes

IM即时通讯实现原理

即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议.前 者是以数据流的形式,将传输数据经分割.打包后,通过两台机器之间建立起的虚电路,进行连续的.双向的.严格保证数据正确性的文件传输协议.而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议. QQ就是使用UDP协议进行发送和接收消息的.当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又是

IM即时通讯实现原理 (转)

即时通讯(Instant  Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议.前 者是以数据流的形式,将传输数据经分割.打包后,通过两台机器之间建立起的虚电路,进行连续的.双向的.严格保证数据正确性的文件传输协议.而后者是以数 据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议. QQ就是使用UDP协议进行发送和接收消息的.当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又

[Python]实现XMPP协议即时通讯发送消息功能

#-*- coding: utf-8 -*- __author__ = 'tsbc' import xmpp import time #注意帐号信息,必须加@域名格式 from_user = '[email protected]' password = 'a1b2c3d4' #可以添加多个接收人 to_user = ['[email protected]'] msg = "您好!这是条测试信息!" def to_msg(): """ 基于xmpp协议的即时

Java---基于TCP协议的相互即时通讯小程序

这是几年前,新浪的一个面试题~要求是3天之内实现~ 通过TCP 协议,建立一个服务器端. 通过配置服务器端的IP和端口: 客户端之间就可以相互通讯~ 上线了全部在线用户会收到你上线的通知. 下线了全部的在线用户会收到你下线的通知! 可以私聊,可以群聊. 这是第一个版本~以后有空可以再增加功能~比如传文件啊~等等~ 设计思想如下: 在服务器端 用一个HashMap 服务器端源代码: package cn.hncu; import java.awt.BorderLayout; import java

音视频技术 即时通讯市场分析

一.市场渗透力以及存在问题 第一,有需求就有市场,有市场就有商机.利字当头,当仁不让.众多服务商就是盯准了即时通讯市场潜在的无限商机,才会不遗余力地开发各类新的即时通讯软件. 第二,即时通讯软件的特点决定了它的普及性,成为了互联网即时和他人联系的重要方式.通过即时通讯软件,人们可以在发出消息后的很短时间内得到对方应答,积极互动,满足了人们几乎同步交流的需求.对于大多数人来说,通过即时通讯进行沟通比电话来得实惠,因而即时通讯受到网民的普遍喜欢. 第三,对于企业来说,即时通讯为他们开拓了网络应用的新