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相关推荐

  1. Python+Django+Channels之Consumers(用户)

    Consumers 因为建立Channels最底层的解释接口是ASGI,被用来连接复杂应用的操作接口 当然你也可以忽略consumers而使用其他Channels部分,像routing,session ...

  2. channels实现websocket实时通讯和消息推送

    Django+channels实现websocket实时通讯@channels Django框架集合channels实现实时通讯和消息推送 channel是Django团队的一个研发的一个给Djang ...

  3. 基于Django channels 与 YOLO v8 搭建 <实时跟踪与统计系统>

    文章大纲 0. 简介 系统Demo 前序文章 1. 系统架构:基于分层结构.组件解耦的<实时跟踪与统计系统> 2. YOLOv8 3. 目标跟踪与计数:SORT ( Simple Onli ...

  4. Python+django网页设计入门(20):使用WebSocket创建多人在线聊天室

    2019年3月8日-10日公众号送书活动:中小学生Python课应该学什么 ================ 前导课程: Python+django网页设计入门(19):创建新模型扩展自带用户表的字段 ...

  5. Django与Channels实现WebSocket

    文章目录 WebSocket ajax轮询 long poll Websocket Channels WSGI ASGI Django中使用 信息交互的周期 前端实现WebSocket 前后端分离项目 ...

  6. Django:使用channels创建websocket,实现消息推送

    感谢:(1)Django+channels配置与编写:https://blog.csdn.net/weixin_40105587/article/details/87375886 (2)Django+ ...

  7. Django使用Channels实现WebSocket消息通知功能

    更多内容请点击 我的博客 查看,欢迎来访. Django Channels https://channels.readthedocs.io/en/latest/installation.html Ch ...

  8. Python Django使用websocket channels3.0.3

    Channels3.0.3 网上的教程是2.4.0,本文照着官方文档整合. Installation - Channels 3.0.3 documentation https://channels.r ...

  9. Django Channels 入门指南

    http://www.oschina.NET/translate/in_deep_with_django_channels_the_future_of_real_time_apps_in_django ...

最新文章

  1. Keil的HTM 文件分析
  2. 皮一皮:编!继续编啊你...
  3. 查看dll文件被哪些软件调用的命令
  4. Sublime package control错误:There are no packages available for installation
  5. 【opencv】图像细化
  6. 很火的WiFi6,了解一下
  7. c++ enum 给定类型_C++11作用域内枚举enum
  8. Jmeter生成html格式测试报告
  9. FileInputStream 把文件作为字节流进行读操作
  10. JavaScript学习笔记:迷宫游戏
  11. 大数据面试-06-大数据工程师面试题
  12. Flask模板参数传值的方法
  13. 【动态规划】01背包:P1049 装箱问题
  14. 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
  15. spring的注入和直接new一个对象有什么不同?
  16. phpstudy下载、安装、配置、网站部署
  17. [转载]Win7微软官方正式版原版镜像下载总汇(附win7 OEM KEY密钥)
  18. The Design of Model (part 1)
  19. 用python画钢铁侠_Matplotlib绘制漫威英雄战力图,带你飞起来!
  20. matlab 相位校正,科学网—全相位比值校正法 - 王兆华的博文

热门文章

  1. Android Material Design 控件常用的属性
  2. android 像素值,调暗像素android的alpha值
  3. iOS小技能:版本升级原则(任何进步都比没有进步好) 检查新版本方案(比较版本号大小的方法)
  4. pptp服务器 虚拟机,pptp服务器设置方法
  5. 蓝牙BLE连接设备报错onClientConnectionState() - status=133解决方法
  6. 提升 Hybrid 体验:饿了么双十一 PHA 框架技术实践
  7. 算法与数据结构java语言描述 英文版_CVPR2020 |室内设计师失业?针对语言描述的自动三维场景设计算法...
  8. lxml python 2.7_在Windows的Python2.7上轻松安装lxml
  9. Python3(综合练习 绘出多个颜色不同的同心圆)
  10. ChatGPT将批量文档翻译成中文的方法