请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师,我想问下,django能做实时消息推送嘛

我现在有一个问题,假设我要做一个点餐小程序,当用户下单后,数据库有数据,此时,我想将数据库里的数据实时推送给后台管理,类似美团商家收到外卖通知后,会有消息提醒,如:您有新的外卖订单了?老师有什么解决办法嘛

正在回答

3回答

这个问题比较典型,应该有不少同学都会有这个问题,在这里我做个简单介绍。先说结论:Django是可以做实时消息推送的,详解如下。


以下的内容分两个部分,我们先来了解消息推送模型的通用设计,再来了解Django怎么样可以实现消息推送。


首先是消息推送模型的设计:

消息推送模型分为推送端和接收端,这里的推送端则是我们通常说的后台服务,比如这里的Django服务;而接收端呢主要是用户可达的客户端,比如app和网站等等。

对于接收端来说,消息推送模型分为Pull模型和Push模型,我们来逐一了解。

什么是Pull模型:

Pull,也就是拉取,指的是客户端主动拉取消息,此时,后台要实现相关的消息接口,客户端定时向后台发起消息更新的查询请求,以此来达到消息及时推送的功能,通信协议比较简单,可以直接使用无状态的HTTP协议。

什么是Push模型:

Push,也就是推送,指的是服务端后台主动向客户端推送消息。这里有个问题,那就是服务端怎么知道客户端的IP和地址?一般而言,客户端都会有服务端的地址,因为服务端的地址相对固定,并且频繁使用,但是服务端一般不会主动保存客户端的地址。所以Push模型一般是对于在线客户端而言的,也就是服务端和客户端之间保持网络连接,并通过心跳保活,连接断开由客户端主动重连。在这种保持连接的状态下,服务端就可以主动向客户端推送消息了,通信协议一般基于TCP连接的基础上自己实现。

哪种模型比较好?

关于Pull模型和Push模型的好坏,在此不做结论,两种模型在消息队列等框架下都有广泛使用,各有千秋,合适的才是最好的。


接下来是第二个部分,Django怎么实现消息推送。

对于Pull模型:

Django实现Pull模型的服务端部分很简单,对外主要是实现一个HTTP接口即可,供客户端主动请求查询,在内部需要维护一个消息队列,用于存储待推送的消息和标记没推送的用户,简单工程可以使用Python的线程安全队列;大工程一般结合Kafka、RabbitMQ等消息队列进行服务解耦。


对于Push模型:

Push模型在网络连接上可以基于WebSocket进行通信,Django上可以使用已有组件实现WebSocket或者可以依赖第三方库,这里WebSocket保证了双方通信的连接,在连接之上,还需要定义通信协议。通信协议怎么理解呢?简单而言,就是需要服务端和客户端协商好通信报文的结构体是怎么样的,在协商好结构体后辅以序列化手段比如json、protobuf等。


希望对你有所帮助。

0 回复 有任何疑惑可以回复我~
  • 提问者 我是三木 #1
    老师,能不能把django的websocket组件讲解或者您这等大牛会选择的好的第三方库介绍下?有点懵,之前有看flask的socket看得很懵,不知道怎么和flask项目结合
    回复 有任何疑惑可以回复我~ 2019-02-19 10:36:23
  • 咚咚呛 回复 提问者 我是三木 #2
    这里有个主次关系,我们学习阶段不一定非要在Flask或Django下去学习某种知识。需要弄清楚我们是需要学习websocket还是要学习web框架,我推荐的学习顺序是先学习python自带的websocket,使用他能够完成一些简单的工程比如简单的IM工具等等,然后再结合框架,在框架内使用websocket。
    
    
    关于Django的websocket组件,可以使用Django官方收录的Django-Channels组件,可以先自行调研了解一下;后续如果大家想学习的需求多的话,我可以出相关文档或视频呢。
    回复 有任何疑惑可以回复我~ 2019-02-19 13:00:47
Ethreal 2019-02-20 07:45:11

老师说的很原理性了,直接给出你想要的答案,第一点 实现这种在传统意义上 第一种最简单的方式是客户端轮训,这种会带来较大的性能损耗 第二种 websocket  进行一次tcp链接,然后保持长连接, 进化方案,由被动轮训进化成主动通知。  而你既然想用django的话  搜关键字 django channels 实时推送     flask的 应该是flask-socketio   东西不难,主要是理解业务之后的编写,可以去多搜搜相关demo 跑个试试就明白了

2 回复 有任何疑惑可以回复我~
  • 提问者 我是三木 #1
    好的,谢谢
    回复 有任何疑惑可以回复我~ 2019-02-20 12:19:55
提问者 我是三木 2019-02-18 23:17:27

老师,能不能把django的websocket组件或者您这等大牛会选择的好的第三方库介绍下?

0 回复 有任何疑惑可以回复我~

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信