Python+Django+channels实现websocket
Python+Django+channels实现websocket
前言
公司需要实现一个长连接,用的Python的Django框架。研究了很长时间,发现Django+channels可以实现websocket。学习Django Channels可以访问官网:https://channels.readthedocs.io/en/latest/
学习,基础写的很详细。这里记录下我实现的websocket测试步骤,备用及分享下。
安装
pip install Django 2.0.2
pip install -U channels 2.0.2
pip install channels_redis 2.0.2
pip install Daphne 2.0.4
pip install asgiref 2.1.6
channels添加到settings.py文件的 INSTALLED_APPS下
注意:
1、若安装过程出现UnicodeDecodeError:‘utf-8’ codec can not decode byte 0xd6 in position 2:invalid continuation byte错误则将/lib\site-packages\pip\compat_init_.py return s.decode(‘utf-8’)修改为return s.decode(‘gbk’)
2、运行channels时,保证redis已启动。
教程
https://channels.readthedocs.io/en/latest/tutorial/index.html
大家可以先去官网学习下,英文档,可以选择翻译也可以读原文档,个人建议读英文档,翻译过来的有点不伦不类。教程有基本设置,实现聊天服务器,将聊天服务器重写为异步,自动化测试,实现这个后差不多懂了一半了。
settings.py文件
#websocket
ASGI_APPLICATION = "trade.routing.application" # 上面新建的 asgi 应用
CHANNEL_LAYERS = {'default': {# 这里用到了 channels_redis'BACKEND': 'channels_redis.core.RedisChannelLayer','CONFIG': {'hosts': [('127.0.0.1', 6379)], # 配置你自己的 redis 服务信息},}
}
路由 routing.py
from django.urls import path
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from trade.consumers import MyConsumerapplication = ProtocolTypeRouter({# WebSocket chat handler"websocket": AuthMiddlewareStack(URLRouter([path("chart/push", MyConsumer),])),
})
WebsocketConsumer
自定义websocket处理类,负责连接,发送,接收,断开连接。
# consumers.py
#-*- coding: utf-8 -*-from channels.generic.websocket import AsyncWebsocketConsumer
from scripts.websocket import updateclass MyConsumer(AsyncWebsocketConsumer):async def connect(self):# 创建连接时调用await self.accept()# 将新的连接加入到群组await self.channel_layer.group_add("chat", self.channel_name)# 信息群发await self.channel_layer.group_send("chat",{"type": "chat.message","text": update('boss_usdt', mode=1),},)async def receive(self, text_data=None, bytes_data=None):# 收到信息时调用# 信息单发# await self.send(text_data="Hello world!")# 信息群发# await self.channel_layer.group_send(# "chat",# {# "type": "chat.message",# "text": text_data,# },# )passasync def disconnect(self, close_code):# 连接关闭时调用# 将关闭的连接从群组中移除await self.channel_layer.group_discard("chat", self.channel_name)await self.close()async def chat_message(self, event):# Handles the "chat.message" event when it's sent to us.await self.send(text_data=event["text"])
管道 websocket.py
#websocket.py
from decimal import Decimal
import json
import time
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from django.db.models import Sum
from trade.views import MARKET_CN, TotalTradeView, TradeListView, TradeLogListView, MarketView
from trade.models import Tradelog, Trade, Market, UserCollecion, UserSettlementFee
from trade.serializers import TradeLogSerializer, TradeListSerializer, MarketSerializer, UserCollectionSerializerchannel_layer = get_channel_layer() # 创建管道def send_to_websocket(value):"""发送到管道"""value = json.dumps(value)async_to_sync(channel_layer.group_send)('chat', {"type": "chat.message", 'text': value})def trade_log(market):"""实时成交"""tradelogs = Tradelog.objects.filter(market=market).order_by('-addtime')[:10]serializer = TradeLogSerializer(tradelogs, many=True)data = {'tradelog': list(serializer.data)}send_to_websocket(data) # 把数据发送到管道,实现websocketdef trade(market):"""挂单列表"""trade_buy = Trade.objects.filter(market=market, status=0, type=1).order_by('price', '-addtime')[:10]serializer_buy = TradeListSerializer(trade_buy, many=True)calculate_num(serializer_buy.data)trade_sell = Trade.objects.filter(market=market, status=0, type=2).order_by('-price', '-addtime')[:10]serializer_sell = TradeListSerializer(trade_sell, many=True)calculate_num(serializer_sell.data)data = {'status': 1, 'depth': {'buy': list(serializer_buy.data), 'sell': list(serializer_sell.data)}}send_to_websocket(data)
总结
Django实现了对Channels的支持,他所使用的是WebSocket通信,解决了实时通信的问题,而且在使用WebSocket进行通信的同时依旧能够支持HTTP通信。但当服务端接收到新的请求时,可能会打断上个请求的执行,这个需要注意下。写的比较简单,还有一些没有贴上来,后续完善后会更新完善。对于初学者还是建议先阅读官https://channels.readthedocs.io/en/latest/ 学习,不建议直接怼代码,会走很多弯路。
Python+Django+channels实现websocket相关推荐
- Python+Django+Channels之Consumers(用户)
Consumers 因为建立Channels最底层的解释接口是ASGI,被用来连接复杂应用的操作接口 当然你也可以忽略consumers而使用其他Channels部分,像routing,session ...
- channels实现websocket实时通讯和消息推送
Django+channels实现websocket实时通讯@channels Django框架集合channels实现实时通讯和消息推送 channel是Django团队的一个研发的一个给Djang ...
- 基于Django channels 与 YOLO v8 搭建 <实时跟踪与统计系统>
文章大纲 0. 简介 系统Demo 前序文章 1. 系统架构:基于分层结构.组件解耦的<实时跟踪与统计系统> 2. YOLOv8 3. 目标跟踪与计数:SORT ( Simple Onli ...
- Python+django网页设计入门(20):使用WebSocket创建多人在线聊天室
2019年3月8日-10日公众号送书活动:中小学生Python课应该学什么 ================ 前导课程: Python+django网页设计入门(19):创建新模型扩展自带用户表的字段 ...
- Django与Channels实现WebSocket
文章目录 WebSocket ajax轮询 long poll Websocket Channels WSGI ASGI Django中使用 信息交互的周期 前端实现WebSocket 前后端分离项目 ...
- Django:使用channels创建websocket,实现消息推送
感谢:(1)Django+channels配置与编写:https://blog.csdn.net/weixin_40105587/article/details/87375886 (2)Django+ ...
- Django使用Channels实现WebSocket消息通知功能
更多内容请点击 我的博客 查看,欢迎来访. Django Channels https://channels.readthedocs.io/en/latest/installation.html Ch ...
- Python Django使用websocket channels3.0.3
Channels3.0.3 网上的教程是2.4.0,本文照着官方文档整合. Installation - Channels 3.0.3 documentation https://channels.r ...
- Django Channels 入门指南
http://www.oschina.NET/translate/in_deep_with_django_channels_the_future_of_real_time_apps_in_django ...
最新文章
- Keil的HTM 文件分析
- 皮一皮:编!继续编啊你...
- 查看dll文件被哪些软件调用的命令
- Sublime package control错误:There are no packages available for installation
- 【opencv】图像细化
- 很火的WiFi6,了解一下
- c++ enum 给定类型_C++11作用域内枚举enum
- Jmeter生成html格式测试报告
- FileInputStream 把文件作为字节流进行读操作
- JavaScript学习笔记:迷宫游戏
- 大数据面试-06-大数据工程师面试题
- Flask模板参数传值的方法
- 【动态规划】01背包:P1049 装箱问题
- 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
- spring的注入和直接new一个对象有什么不同?
- phpstudy下载、安装、配置、网站部署
- [转载]Win7微软官方正式版原版镜像下载总汇(附win7 OEM KEY密钥)
- The Design of Model (part 1)
- 用python画钢铁侠_Matplotlib绘制漫威英雄战力图,带你飞起来!
- matlab 相位校正,科学网—全相位比值校正法 - 王兆华的博文
热门文章
- Android Material Design 控件常用的属性
- android 像素值,调暗像素android的alpha值
- iOS小技能:版本升级原则(任何进步都比没有进步好) 检查新版本方案(比较版本号大小的方法)
- pptp服务器 虚拟机,pptp服务器设置方法
- 蓝牙BLE连接设备报错onClientConnectionState() - status=133解决方法
- 提升 Hybrid 体验:饿了么双十一 PHA 框架技术实践
- 算法与数据结构java语言描述 英文版_CVPR2020 |室内设计师失业?针对语言描述的自动三维场景设计算法...
- lxml python 2.7_在Windows的Python2.7上轻松安装lxml
- Python3(综合练习 绘出多个颜色不同的同心圆)
- ChatGPT将批量文档翻译成中文的方法