doraemon的python Flask框架 websocket和redis

3. CBV

from flask import views
​
class Login(view.MethodView):
    def get(*args,**kwargs):
        pass
    
app.add_url_rule("url",endpoint=None,view_function=Login.as_view(name="当前视图函数名,必须唯一,因为他就是endpoint"))

 

4.Redis

指令:

  • set key value 用来在数据库中设置一个键值对 哈希存储结构{key:value}

  • get key 返回value 用来从数据库转给你去除key相应的value

  • key * 查询当前库中所有的key

  • select dbnum 范围是0-15 用来切换数据库达到数据分离

 

5.websocket

需求:制作一个即时的通讯工具

  1. 先做前段

  2. 建立webserver 用Django或者Flask

  3. 制作聊天功能

  4. 断开连接

连接的分类:

  • 轮询:

    • 不能保证数据实时性

    • AB Client -> 无限循环和Server对话 有xx的消息吗

  • 长轮询

    • AB Client -> Client发起请求至Server 有xx的消息吗 -> 等待消息时间 1x/s

    • ->主动断开连接

    • -> 收到消息主动返回

  • 长连接:

    • AB client ->Server 建立连接并保持不断->A to B ->Server 消息转发-> B 建立连接的情况下 -> 可以及时准确的收到消息

 

举例:寝室 - 传达室

轮询 Http 二大爷 收到快递 小二 小二跑到传达室问 : 二大爷有我快递吗? 二大爷打量了一下小二问 : 你丫谁呀? 小二 : 大爷,我是大一的小二 大爷 : 我知道了,你找我什么事儿 小二 : 有我快递吗? 大爷 : 你等会我给你找找 小二 : 不着急 大爷 : 回去吧,没有

长轮询 学校扩大传达室,可以摆一间茶室 小二跑到传达室问 : 二大爷有我快递吗? 二大爷打量了一下小二问 : 你丫谁呀? 小二 : 大爷,我是大一的小二 大爷 : 我知道了,你找我什么事儿 小二 : 有我快递吗? 大爷 : 你等会我给你找找,进屋喝杯茶,目前没有,不代表一会儿没有 1------ 小二 : 我去方便一下(超时) 小二完事儿之后: 哎?刚才我干嘛去了

2------ 大爷 : 一杯5块,前3杯免费 小二 : 喝完3杯,被大爷赶出去了

3------ 大爷 : 小二你快递~ 小二 : 好嘞谢谢大爷

长连接 大三: 又装修传达室 按电话了 程控交换机 小二跑到传达室告诉大爷他是谁 大爷给小二一张带有电话号码的纸条 小二打电话过去 大爷接起电话,问你是谁 小二:我是小二,你刚才让我打的电话 大爷:我知道了,电话别挂,开免提,有快递我告诉你

当收到快递时,大爷开启通话,通知小二有快递的事情

小二做出响应

客户端 和 服务器 保持永久性的连接 除非有一方主动发起断开

付费服务 消息转发

5.1 长连接

模块需求:Gevent-WebSocket

http请求和websocket

#http
'HTTP_CONNECTION': 'Upgrade,keep-alive'
    
#websocket
'HTTP_CONNECTION': 'Upgrade',
'HTTP_UPGRADE': 'websocket',
'HTTP_SEC_WEBSOCKET_VERSION': '13'
'HTTP_SEC_WEBSOCKET_KEY': '+XlqBnhqwEekZTYcz4I+tg=='
'HTTP_SEC_WEBSOCKET_EXTENSIONS': 'permessage-deflate; client_max_window_bits'
'wsgi.websocket_version': '13'
'wsgi.websocket': <geventwebsocket.websocket.WebSocket object at 0x00000120280E54C0>

   

前端显示的转态码

  • 1.当前连接处于可用状态

  • 3.由服务器主动发起断开

  • 0.正在建立连接或连接建立失败

  • 2.客户端主动发起断开

 

基于 websocket 实现群聊 1.建立websocket 服务 + Flask web框架 + Gevent-WebSocket 2.request.environ.get("wsgi.websocket") 获取连接 2.5 - 将获取到的连接保持在服务器中 socket_list = [] 3.基于长连接socket 接收用户传递的消息 4.将消息转发给其他用户

基于 JavaScript 实现 Websocket 客户端 var ws = new WebSocket("ws://") # ws 的路由地址 ws.onmessage = func(MessageEvent){实现逻辑}

ws.onmessage 当ws客户端收到消息时执行回调函数 ws.onopen 当ws客户端建立完成连接时 status == 1 时执行的回调函数 ws.onclose 当ws客户端关闭中或关闭时 执行的回调函数 status == 2,3 ws.onerror 当ws客户端出现错误时

 

收发快递模型

萧帮主的气筒 sender : 商家 receiver: 萧帮主 data : 气筒

退换气筒 sender: 萧帮主 receiver: 商家 data : 气筒

Websocket单点聊天时的转发 服务器中保存的连接方式发生变化 以字典形式储存 存储结构 : {用户的唯一标识:Websocket连接,user1:Websocket} 单点消息发送时 receive data = {sender:发送方,receiver:接收方,data:数据} 从data中找到接收方的"名字"Key 拿着名字key 去存储结构中 找到 名字Key所对应的websocket连接 websocket连接.send(data) # socket 传输 bytes

猜你喜欢

转载自www.cnblogs.com/doraemon548542/p/11863752.html