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
需求:制作一个即时的通讯工具
-
先做前段
-
建立webserver 用Django或者Flask
-
制作聊天功能
-
断开连接
连接的分类:
-
轮询:
-
不能保证数据实时性
-
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 : 气筒
Websocket单点聊天时的转发 服务器中保存的连接方式发生变化 以字典形式储存 存储结构 : {用户的唯一标识:Websocket连接,user1:Websocket} 单点消息发送时 receive data = {sender:发送方,receiver:接收方,data:数据} 从data中找到接收方的"名字"Key 拿着名字key 去存储结构中 找到 名字Key所对应的websocket连接 websocket连接.send(data) # socket 传输 bytes