django+channels+websocket完成一个实时推送系统

前言

因公司项目需求,需要建立一个展示网站,接入两台摄像机,当摄像机的照片流传过来的时候,实时展示到网页中,所以需要做一个实时推送系统的小demo,因接触django时间不长(两周左右),也算边做边学习了,网上用channels做实时聊天系统的较多,实时推送系统的比较少。

好了,进入正题。demo采用pycharm+django开发,具体用到的库有:channels、channels_redis。关于项目建立的步骤自行百度,不多赘述,pycharm建立django项目的时候已经帮你建立好了虚拟环境,很多事情基本上不需要你做了,直接码代码就可以了!!!
(下面示例的项目名称(project:mysite,app:myapp)

项目配置

1、先添加相关库
工具栏File–>Settings–>Project:(mysite)–>Project Interpreter–>±->channels+channel-redis
特别注意,channels-redis版本选择2.4.2,选择3.0.1会和本地redis服务器冲突,原因不详。


2、修改项目settings
将你创建的app和channels一并添加进去

因为使用channels_redis,咱们就一并修改了

ASGI_APPLICATION = 'mysite.routing.application'
CHANNEL_LAYERS = {'default': {'BACKEND': 'channels_redis.core.RedisChannelLayer','CONFIG': {"hosts": [('127.0.0.1', 6379)],},},
}

3、修改路由
(也可以不做这一步,只是为了让项目路由分类更加清晰,便于后期维护)
添加app路由
在myapp的目录下创建一个urls.py文件
/myapp/urls.py

from django.urls import path
from . import viewsurlpatterns = [path('', views.index),
]

然后在项目路由下导入你的app路由
/mysite/urls.py

from django.conf.urls import include
from django.urls import pathurlpatterns = [path('', include('myapp.urls')),
]

以上这一步等于直接在
/mysite/urls.py 修改

from django.urls import path
from . import viewsurlpatterns = [path('', views.index),
]

4、添加asgi应用路由
咱们在settings已经修改了ASGI_APPLICATION = ‘mysite.routing.application’
因此在/mysite/新建一个routing.py

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import myapp.routingapplication = ProtocolTypeRouter({'websocket': AuthMiddlewareStack(URLRouter(myapp.routing.websocket_urlpatterns)),
})

这里简单的解释一下:它使您可以根据中type存在的值将其分派到许多其他ASGI应用程序 之一scope。协议将定义其作用域包含的固定类型值,因此您可以使用它来区分传入的连接类型。
简而言之就是根据你的需求指向不同的url(连接的是你的视图函数)

接着添加应用的路由
即/myapp/routing.py

from django.urls import path
from . import consumerswebsocket_urlpatterns = [path('image/', consumers.PushConsumer),
]

5、创建后台的推送函数
在myapp目录下创建consumers.py
/myapp/consumers.py

import json
from channels.generic.websocket import AsyncWebsocketConsumer
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer# 推送consumer
class PushConsumer(AsyncWebsocketConsumer):async def connect(self):self.group_name = 'image'await self.channel_layer.group_add(self.group_name,self.channel_name)await self.accept()async def disconnect(self, close_code):await self.channel_layer.group_discard(self.group_name,self.channel_name)# print(PushConsumer.chats)async def push_message(self, event):await self.send(text_data=json.dumps({"message": event['message']}))# 构建函数,便于外部调用
def push(username, message):channel_layer = get_channel_layer()async_to_sync(channel_layer.group_send)(username,{"type": "push.message","message": message})

6、不要忘了我们的视图函数view.py

from django.shortcuts import render
from .consumers import push# Create your views here.
def index(request):for i in range(10):push('image',i)return render(request, 'index.html')

这里举了一个简单调用的例子
for i in range(10):
push(‘image’,i)
向image组的所有成员推送0,1、2、3…9
就是那么简单

7、在网页建立我们的websocket连接
建立一个index.html页面

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"/><title>接收端</title>
</head>
<body><textarea id="log" cols="100" rows="20"></textarea><br><script>const chatSocket = new WebSocket('ws://'+ window.location.host+'/image/');chatSocket.onmessage = function(e) {const data = JSON.parse(e.data);document.querySelector('#log').value += (data.message + '\n');};chatSocket.onclose = function(e) {console.error('Chat socket closed unexpectedly');};</script>
</body>
</html>

这样就建立好websocket连接了

测试

打开本地的redis服务器,打开方法请自行百度下载并打开进行测试
就是下面这个东东
官网下载过慢,慢到让你窒息,别傻傻的等,请自行寻找国内资源。

如果是采用的本地测试,直接在本地打开几个网页,默认的为127.0.0.1:8000。基本效果就是没打开一个网页,上一个网页就是打印0-9的数字

如果是采用局域网的方法
在settings.py文件中修改

ALLOWED_HOSTS = [你本地电脑的IP地址]

这样就可以在同一局域网的另一台电脑打开网页进行测试,效果和本地测试相同。

以上,菜鸟一枚,欢迎指正,哈哈~
如果有不懂的可以多多查看官方文档:channels官方文档
相关文档

django+python搭建消息推送系统相关推荐

  1. Java版WebSocket消息推送系统搭建

    Java版WebSocket消息推送系统搭建 最近在做消息推送,网上查了一些资料,开始想的是用MQ来做,后面发现用WebSocket来做的话感觉应该要简单点,话不多说,准备撸代码. 后端核心代码 /* ...

  2. python websocket实现消息推送_python Django websocket 实时消息推送

    [实例简介] Django websocket 实时消息推送 服务端主动推送 调用 send(username, title, data, url) username:用户名 title:消息标题 d ...

  3. 如何利用springboot快速搭建一个消息推送系统

    最近在完善毕设的路上,由于是设计一个远程控制物联网系统,所以服务端到硬件我选用了MQTT协议.因为MQTT的发布/订阅模式很适合这种场景.接下来就来聊聊遇到的一些问题以及解决思路吧. 毕设技术栈:sp ...

  4. 消息推送系统——(零)推倒萝莉之术

    当一个初学Web开发的童鞋,产生让服务器"主动"给浏览器客户端发送数据的想法的时候,比他入门稍早的同学会说: "这是Web!只能由浏览器发起请求,然后得到服务器返回的数据 ...

  5. go语言消息推送服务器,Golang 消息推送系统

    ## Golang 消息推送系统 - 使用 websocket 协议,实现全局推送,和分房间推送,实现用户加入房间,退出房间 - gateway 长连接网关服务器,管理全部的链接,以及房间等相关操作 ...

  6. 开源实时消息推送系统 MPush

    系统介绍 mpush,是一款开源的实时消息推送系统,采用java语言开发,服务端采用模块化设计,具有协议简洁,传输安全,接口流畅,实时高效,扩展性强,可配置化,部署方便,监控完善等特点.同时也是少有的 ...

  7. 消息推送系统——(一)概念与原理

    这里我们从系统结构的层面来看消息推送系统(Push Server)的基本原理. 首先需要了解几个基本的概念: HTTP长连接 翻译自http keep-alive connection和http pe ...

  8. 设计一个百万级的消息推送系统

    2019独角兽企业重金招聘Python工程师标准>>> 前言 首先迟到的祝大家中秋快乐. 最近一周多没有更新了.其实我一直想憋一个大招,分享一些大家感兴趣的干货. 鉴于最近我个人的工 ...

  9. Django dWebScoket 实时消息推送

    一.WebScoket是什么 WebSocket 是 HTML5 提供的一种浏览器与服务器间进行全双工通讯的协议.依靠这种协议可以实现客户端和服务器端 ,一次握手,双向实时通信.目前主流的浏览器都支持 ...

最新文章

  1. Listen error 错误和 limit of inotify watches was reached
  2. JVM(13)之 阶段回顾
  3. 使Win10用户获得特殊权限以便删除相应文件(夹)
  4. Kaggle问题总结1
  5. D - Undoubtedly Lucky Numbers CodeForces - 244B(数论 )
  6. 洛谷 P3391 【模板】文艺平衡树
  7. php-cgi cpu很高,php-cgi占用cpu资源过高的解决方法
  8. C语言作业不足之处,C语言和汇编语言的优缺点分析-控制器/处理器-与非网
  9. php 延迟输出,PHP循环;如何打印每个结果并将其延迟一秒钟,然后再回显另一个结果?...
  10. Java web项目目录结构以及作用详解
  11. 每一个人都应该学习电脑编程,因为它会教你如何思考
  12. Intel VT-d(1)- 简介
  13. JSP页面图片显示不了
  14. TSN(时间敏感网络)纯干货分享
  15. visibility与display的区别:
  16. vue el-form表单验证,多表单验证及动态数据项表单验证
  17. 数理逻辑习题集(11)
  18. Cesium第一次搭建环境出不来地球的问题
  19. 生成二维码并且将生成图片转换成输入流
  20. Unicode 字符集七个字符属性

热门文章

  1. Python装逼神器,5 行 Python 代码 实现一键批量扣图!
  2. Android开发接入第三方SDK流程
  3. 浅谈Attention机制
  4. 适合程序员编程的笔记本电脑如何选择?
  5. Linux sdkman使用方法
  6. 如何把源代码格式复制到WPS文档中
  7. 下列关于三种数据交换方式的叙述,错误的是( )
  8. android 强制退出当前应用程序,android 强制退出应用
  9. BZOJ 3653 谈笑风生
  10. [WARNING IsDockerSystemdCheck]: detected “cgroupfs“ as the Docker cgroup driver. The recommended dri