做个比喻, 如果说A是服务端, B是客户端, 现在要在A家里吃火锅, 虽然A说你人来就行, 但是B心想总得带点东西过去, 于是去了市场
先到了蔬菜店, B想买点菠菜, 但又怕A家里已经有了, 于是给A打电话
B: "我带点菠菜过去吧"
A: "好"
然后挂断 过一会儿到了水产区
B: "我带点虾过去吧"
A: "不用"
如此反复多了之后A突然发现自己确实少准备了一些东西, 于是A给主动给B打了电话
A: "我忘准备蘸料了, 你买点, 然后先别挂掉"
A: "再买瓶酒"
这就是websocket了
django当让也提供对websocket的支持, 虽然这似乎不是他更擅长的东西 我们可以通过channels实现websocket连接
诸如上述例子的场景都是合适的场景
举例来说的话比如聊天室, 每个人发送的消息都要实时显示在别人的屏幕上
比如说数据监控, 波动状态也要实时的呈现在屏幕上, 而不是依赖于使用者自己刷新
需要安装 channels , asgi_redis , asgiref , channels_redis 后三个未必都需要装, 记不太清了, 总之安装过程都在channels的使用文档上
INSTALL_APPS 中需要加上 "channels" , 需要注意的是因为这是一个list, 是有先后顺序的, 最好把它加在第一个
这里我们的channel通过redis实现, 要在 settingspy 中配置
这里还有点小坑, 官方文档里的hosts不是这种格式, 是 "uri" 这种模式, 但是如果你在设置redis密码时机智的设置了特殊符号( '#$%' 这种), 你就会发现redis的 uri 直接就用不了了, 期间尝试各种方法, 转义什么的也试了都不行, 然后去github上开了个issue, 结果作者说我们是通过 aioredis 连接的, 你去找他们的文档吧
然后就找到了这种方式
常规的WSGI不支持websocket, 所以还需要配置ASGI
ASGI_APPLICATION = 'projectroutingapplication'
同wsgi的配置一样, 这是指向 project 文件夹下 routingpy 文件的 application
这里建议大家跟这官方教程的Tutorial走一遍 有个比较悲剧的地方就是网上可以搜到许多channels使用指南, 大多都是搭个简易聊天室什么的, 然而你用起来可能发现存在各种报错, 因为channels升了20之后更改了一些方法, 而那些教程里基本全都是1x的版本
简单说下, 首先 startapp 叫 chat , 假如这里我们没有进行前后端分离, 里面有 templates , 两个 html : index 和 room 分别对应首页和某一个聊天室
新建 consumerspy 来写 websocket 方法
如上, connect 和 disconnect 含义分别如函数名 因为是聊天室, 所以同一个聊天室内的人应该消息共享, 用 room_group_name 来区分所在的频道
receive 和 chat_message 是对消息的处理 当一个用户发送消息时, 前端把消息通过websocket发送过来, receive 收到消息提取关键内容, 通过 chat_message 发送给组内的所有连接 这时保持连接的所有组内人员都会收到这条消息推送, 前端收到推送再显示在屏幕上
定义websocket的地址
类似于 django 的 url ( consumerspy 就类似于 viewspy ), 同级新建 routingpy
统一用ws/来区分websocket的连接
剩下常规的页面配置和django一样
viewspy :
urlspy :
注意: 如果网站是>
>
phpweb控制器每更新数据库数据库我需要些数据发送其用户客户端 知web控制器实现目才能swoole_websocket_server发送些新数据再建立 swoole_client觉
-
以上就是关于django websocket全部的内容,包括:django websocket、WebSocket使用及在vue如何使用、使用WebSocket构建实时聊天等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)