巨蟒python全栈开发flask10 项目开始2
1.websocket异常处理
出现上图报错的原因是什么?
原因是:websocket断开了,所以报错
19行接收的msg是None值,所以报错.
打开一个文件,点击发送音乐,出现上面的内容:
客户端app发送的是1,浏览器发送的是2
to_user=toy01
to_user_socket=None
此时,to_user_socket是None里边没有send 方法,自然会报错.
下面,我们会学习一种web断开之后重新连接的一种机制进行处理.
"请确认你的眼神",左右眼
再写一个mbo,注册有现成的我们直接找,就可以了:
我们在body里边写入注册框:
我们需要在index.html里边的设置写上一个id
下面我们再写一个,绑定页面.,这个时候,需要绑定两个页面
下面进行判断一下:
2.注册+登录+自动登录
玩具有一项开机自检的功能非常的强悍.是授权就可以,不授权就不可以.
下面,我们开始写一个登录页面,login.html,清空,写代码块md,
因为是一个主界面,所以,我们不能够带箭头,因此选择mhe代码块中不带箭头的内容
写完之后,我们保存一下,进行同步,但是我们需要点击"设置",进入"login页面"但是目前,我们点击设置"是没有反应的
这个时候,我们通过打印进行测试一下:
保存一下:
上边的extras去掉:然后保存一下:
重启启动程序:
这个时候,点击设置,出现跳转不过去.也就是localStorage里边是有值的,我们跳转不过去,只能在前端打印上边的内容11111
我们需要清空掉上边的内容:
先写一个清空命令,保存一下,这个时候,再注释一下这个清空命令,一直点击"这个设置",没有出现界面,原因是没有保存login.html页面.
我们现在在上图的界面,再点击"返回",正常是直接退的,但是现在返回的是home页面
我们可以在login.html写一个重新返回的函数为空,这样就按返回键,就什么都不能返回了.
这个时候,我们再点击"返回",已经返回不了原来的home界面了
我们只能点击首页,但是现在我们可以在首页加上一个id,
我们在上边,先加上一个home,然后绑定一个事件:
先写一个dga,再写一个mop
这个时候,我们就可以在"首页"和"设置"之间来回切换了,但是存在的问题是,"速度可能会慢一些"
问题:在home页面也存在返回,就返回到了登录页面,因此我们再home页面也是需要做一下处理的.
back,只要是主菜单都是需要用这个内容的.
这个时候,点击"返回"就不能再返回了
先修改一下快捷键:"工具"=>"选项"
下面,搜索"快捷"
我们将整理修改成Ctrl+Alt+L
python学完之后,有点强迫症,下图中加上id
上面,我们再写绑定事件:
reg是子页面,这个时候,我们需要再次新建一个注册页面:
md代码块,mhe代码块选择"带箭头的代码块"
title="注册用户"
下面我们再写一个body
这个就是我们事先注册页面的功能:
下面,我们再在注册页面里加上注册框,
下面再写一个昵称和性别,性别是需要选择的
我们查看一下单选框:
单选框代码块是mra,选择第二个
因为性别是单选框,我们需要写两个选择其中一个:
保存,这个时候得到下图的效果:
app过审,需要不能直接写男和女,苹果需要审查
我们可以通过下图的方式,实现数据的获取
下面,我们写注册之后能拿到的内容:
注意,下面的性别的取法是有一点点不同的,定义的越多,拿到的越多,并且需要通过for循环来拿这个
mdt代码块
下面,我们再服务端新建一个user.py
套用content.py里边的信息,将内容写在下面的位置
下面,我们再在manager.py里边导入user.py
这个时候manager.py已经挂掉了,但是我们可以继续添加内容进行处理,,导入flask里边的request请求
点击"注册",后边服务端,没有收到任何消息
没有收到消息是后端没有开启运行,,开启之后,我们再次点击"注册",下面是服务端收到的消息
上图是一些内容
这个时候,我们可以看一下数据,登录NoSQL客户端:
连接之后,点击刷新一下,得到下面的内容
很明显,上边的密码是不够安全的,因此我们需要进行密文处理一下
首先,我们将下面的username,复制到"搜索"里边,然后情况下面右下角里边的内容:
右击,移除文档,点击"OK"
我们在后端加MD5,进行处理比较容易
下面的这个博客可以利用下面的加密方式进行处理
我们先点击,上边的"下载MD5压缩包"
我们得到上边的内容是,md5.js
我们只需要两部,一步导入,一步添加加密
第一步就是导入
下面,我们保存一下,再次注册一遍:
再次点击"注册",
这个时候,我们在mongodb里边看到的是密文:
下面,我们需要,点击注册之后跳转到的不是login页面,应该是登录状态,下面我们需要再写一个监听事件
我们现在写这个url,有点费劲,我们希望可以实现这个不要这么麻烦,在配置文件里边配置一下:也就是我们看到每个页面都要加载mui.init
也就是说,我们让整个项目都可以使用这个
下图是修改之后的位置:
下面是,进行处理,
我们得到上边的内容:
为什么写app01?, 我们看起来是个死的,实际上是个动态的参数,前面有个ws
下面,我们再login登录界面进行添加,用户和密码的id
下面,我们再在后端写一个接口
复制,上图红框内的内容:
再次启动服务端:
在注册页面输入信息,
我们得到下面的信息
下面我们进行判断一下:
下面,我们再新建一个user_info.html信息
为什么写不带箭头,因为和这个不确定是"用户信息",还是"登录login"页面
这样,我们就将用户信息传递到user_info.html界面了
这个时候,我们得到下面的信息:
如果缓存存在,就打开用户信息这个界面:
下面,我们就可以传递值user_info
extras可以传递值user_info
下面我们再在user.py里边再写一个auto_login
注意,要及时保存,退出,再次登录,点击"设置",我们可以看到下图中的信息:
下面我们需要在user_info.html里边拿一点东西
在上图中加上var处理
注意:_id都应该是小写的形式
上边一直出不来这个用户信息???
经过我反复找错误,最后终于出来了
3.user_info&&toy_manager
下面,我们写一个图文列表:
删除或者注释掉上边红框的内容:
我们再来一个图文列表:
mli,图片居左:
mbo代码块里边的mli,选择第三个,我们看到下面的效果:
只留下一个:
得到下图的结果:
下面,我们就显示"图片","昵称",以及真实姓名
下面我们再app基础上建立一个图片文件avatar
将两张图片放在avatar里边
下面我们修改下面的内容:
下面我们看一下app里边的显示效果:
下面,我们再写一个登出
修改成红色,并且id="logout"
下面,我们再写一个登出的事件,要清除缓存的内容
管理玩具通畅也需要写在"用户信息"这个页面
添加一个"普通"列表:
我们只需要留一个li标签就可以了
我们要加上一个图标,否则太单调了
上图中的icon有图标
保存,我们就可以看到下面的效果了
我们可以,在点击管理的时候,直接跳转到玩具页面:
下面,我们再绑定一个事件:
dga代码块,打开一个新的页面:
因为是子页面,因此不需要style了
下面,我们再写一个toy_manager.html页面:
清除,然后mdo代码块
写一个带返回箭头的mhe:
下面,我们再写一个图文列表mli,图片居左的
只留一个就可以了
感觉还是有点不好看,我们再改变一下:
新建一个文件images,放在images里边:
4.创建二维码
我们可以通过程序的每个编号生成一个唯一的二维码进行处理:
我们通过程序对接二维码,然后进行处理,进行着批量处理的过程
通过二维码API进行处理:
使用这个"联图二维码"
http://qr.liantu.com/api.php?text=
在上边连接后边加上数字可以生成唯一的二维码
下面,我们再在后端写一个QRcode.py进行处理
下面通过requests模块进行一些测试:
我们可以得到一个200的响应
print(res.content),打印出来的就是流,下面,我们将这个流写入到文件里边:
下面我们需要配置一下"联图二维码"的配置.
我们需要将转化之后的二维码保存一个文件夹内:新建一个QRCode文件夹
写完之后,我们还想存储到数据库中
,最后我们再写入到mongodb里边
QRcode.py代码如下
# Author: studybrother sun
import requests
from settings import LT_URL,QR_PATH,MONGODB
from uuid import uuid4
import time,hashlib,os
def create_QR(num):
qr_li=[] #创建一个空列表
for i in range(num): #通过循环创建多个玩具
qr_info=f"{time.time()}{uuid4()}{time.time()}"
qr_code=hashlib.md5(qr_info.encode("utf8")).hexdigest()
res=requests.get(LT_URL % qr_code)
qr_img=os.path.join(QR_PATH,f"{qr_code}.jpg")
with open(qr_img,"wb")as f:
f.write(res.content)
qr={"device_key":qr_code} #将字典放在列表中
qr_li.append(qr) #每次写完添加一次
time.sleep(0.12) #加入时间,是因为可能qps超标
MONGODB.devices.insert_many(qr_li)#设备信息devices
if __name__ == '__main__':
create_QR(10) #下面测试一下
运行:
链接已经发生了改变
问题是有很多隐藏的bug,需要一点点挖掘
这个时候,链接已经有了图片对应 :
清空原来的数据,再次运行,得到下面的10条数据在MongoDB里边
5.扫码页面低版本
下面我们找一下H5plus,找一下扫描二维码的功能
上边的信息,看不太懂,"方法什么的",主要是,
从最简单的入手解决问题,现在我们要"跳转到新页面"
创建一个qr_scan,二维码扫描.情况,mdo代码块
mhe肯定是带箭头的
下面,我们需要绑定事件进行处理
下面我们再写事件
点击"扫描绑定玩具"得到下面的界面
看一下这个create
id是必填项
我们从案例中找到具体的内容
直接覆盖原来的代码:qr_scan.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Barcode Example</title> <script type="text/javascript" > // 扩展API加载完毕后调用onPlusReady回调函数 document.addEventListener( "plusready", onPlusReady, false ); // 扩展API加载完毕,现在可以正常调用扩展API function onPlusReady() { var e = document.getElementById("scan"); e.removeAttribute( "disabled" ); } var scan = null; function onmarked( type, result ) { var text = '未知: '; switch(type){ case plus.barcode.QR: text = 'QR: '; break; case plus.barcode.EAN13: text = 'EAN13: '; break; case plus.barcode.EAN8: text = 'EAN8: '; break; } alert( text+result ); } function startRecognize() { scan = new plus.barcode.Barcode('bcid'); scan.onmarked = onmarked; } function startScan() { scan.start(); } function cancelScan() { scan.cancel(); } function setFlash() { scan.setFlash(); } </script> <style type="text/css"> *{ -webkit-user-select: none; } html,body{ margin: 0px; padding: 0px; height: 100%; } #bcid { background:#0F0; height:480px; width:360px; } </style> </head> <body > <input type='button' onclick='startRecognize()' value='创建扫码控件' /> <input type='button' onclick='startScan()' value='开始扫码' /> <input type='button' onclick='cancelScan()' value='取消扫码' /> <input type='button' onclick='setFlash()' value='开启闪光灯' /> <div id= "bcid"></div> <input type='text' id='text'/> </body> </html>
这个时候,我们可以看到上边的界面:
下载这个软件,实现电脑和手机之间的连接
手机链接上之后,发生的变化:
一直没有和手机连接成功,原因可能是wifi的问题,用自己的电脑开启wifi,可以成功了.成功扫码了.
(一个晚上过去了)
上边的ApowerMirror是一个可以投影的软件,但是,输入密码,自己会变黑,防止密码泄露
.
6.扫描二维码&&数据校验
这个时候,我们就可以扫码进行处理了,可以得到
下面,我们想要修改一下二维码的样式,改成mui相关样式
在app里边新建一个scan,md代码块,mhe(带箭头的代码块)
下面,我们找一下这个qr_scan示例代码以及事件:
将上边的两行代码,都放在scan.html里边:
这个时候,我们玩具管理,跳转到scan.html页面里边:
点击,扫码,出现下图的错误:
我们应该写在mplus里边写
修改之后,出现上图中的错误:
注释上边这一行
查看一下原来程序中的源码:
我们追加到scan里边:
放开注释行:
源码中有一个bcid
我们将源码,放在图示位置:
bcid有高宽,我们需要自己定义:
只有限制二维码大小才行
这个时候,二维码,才能开始扫码
我们可以先删掉图示的位置:
反正也看不懂,先删掉
我们直接打开,这个结果::
扫完码,底部就可以出来内容了
toast也就是一种提示框的意思:
我们想要的效果,是扫完之后,关闭扫描页面,
添加上图的mui.back();代码之后, 这个时候扫描二维码,跳转到一开始的界面:
我们需要鉴定,是不是我们数据库中的二维码,这个时候才会有价值,下面我们再后端进行再在serv里边创建一个py蓝图文件
我们可以,套用user.py里边的信息
下面开始发送数据在前端:
这个时候,我们需要在后端的manager里边将蓝图注册一下蓝图
修改完成后,我们随便扫一个码,看一下前端app能不能打印出内容:
这样既可以扫描成,也可以扫描失败了
现在,我们不想每次都扫码,先每次给一个值处理
注释,并且保存这个吗,以后扩展,再打开
这个时候,我们再扫码,就会永远扫码成功
上图是,我们再打印消息
这个时候,我们开始可以扫码了
7.绑定玩具
扫码成功该干什么?
下面,我们开始绑定一个玩具
新建一个bing_toy.html
我们需要在第二个框,里边写上注册框,在login.html里边拿现成的就可以了
下面我们再刚才的scan.html里边扫码成功就开启
这个时候,我们点击扫码,可以打开下图
下面,我们再修改一下绑定事件:
post,要么是发送请求,要么是打开新窗口,这两种方式:
下面,我们传递数据,下图是bind_toy.html页面
下面,我们再写后端的界面:
下面,我们再在devices.py里边写绑定玩具
拿到玩具信息,并且再加上一些信息
我们的目的,就是,更方便的操作后端信息:
下面,保存,运行,开始扫码:存在一点问题:
删除上图的代码:
这个时候,扫描可以出来正确的"创建你的玩具了"
输入上边的内容,点击"绑定创建玩具"
这个时候,我们看到"服务端请求成功了"
找了半天错误,最后前后端都重新启动变好了,上图是传递回来的数据
我们绑定之后应该显示,绑定几个显示几个
toy.jpg
我们将下载的图片放在,avatar里边
我们需要只要一点击进入这个"toy_manager.html"里边,就能拿到玩具列表
下面,我们还是需要在devices里边写一个接口:绑定的玩具列表
注意上图的第32行
下面,再做一下修改
我们拿到"源源",怎么处理这个数据?
我们需要添加一个图文列表和id
我们再home页面中,创建过一个类似的页面:
这个创建内容的,大的函数
我们将这个函数放在toy.manager.html页面的script的上边
我们需要将下图的这个位置注释掉
修改上图的形参为toy_info
上边玩具名,下边宝宝名字,左边是玩具的头像
写完之后,我们需要将列表进行for循环一下:
这个时候,我们重新启动,并且重新登录,看一下能不能出来结果:
由此,我们可以得到结果,注意下图的位置不要写错了
修改成圆形的图片:
这个时候,就变圆了,如果绑定完成,我们需要跳转到一个页面:
下面,我们再次绑定一个玩具,看一下效果
上一个,我们选择尾号的是9b,下面我们选择5a
点击绑定创建玩具,得到下面的内容
其实绑定逻辑里边还有一个逻辑,那就是添加好友的逻辑
8.玩具开机
现在我们启动玩具,只要玩具已启动就能访问websocket,
上图中的websocket并不是玩具id连接上的
上图显示的是我们创建的两个玩具
我们需要用859e进行连接
我们想要通过key,拿里边的_id的值
下面,我们再看一个隐藏的需求:
下面,我们希望合成上边的三句话:
我们用一下第六天的内容,文本转声音文件:text2audio.py
打印出流和mp3文件:
我们再合成一个NoBind.mp3文件:
生成第三句话
最后,我们将生成的文件,放在music文件夹里边
下面,我们将玩具只要一开机,我们执行一个视图函数:
我们先将,下面的几行先注释掉:
下面,我们写一个按钮,开机
下面,我们再写一个函数
下面,我们再在后端新建一个静态文件:static,把jquery文件放在里边
下面我们再发送信息,通过ajax,这里是$post
我们通过"火狐浏览器进行发送信息"
我们先放一个正确的device_key
点击"开机",在控制台中打印出了Success.mp3
现在我们想要播放出来
这个时候,我们再次点击开机:要先刷新一下浏览器才行
下面再找一个授权的但是没有绑定:
下面的是一个没有授权的地址:
科大讯飞的合成工具很NB的
点完开机,我们就应该去连接,那么我们拿什么去连接呢?我们应该拿玩具的id进行连接
线面我们再在devices.py里边写一个玩具的id,当玩具传递成功之后.
在火狐浏览器中,先输入一个错误的id
没有绑定的地址:
下面,我们用正常的值进行处理
这个时候,我们得到正确的结果:
这个时候,我们断开ws_serv.py,重新连接,
有可能随时导致服务器崩盘,我们如何让用户无感知的连接:
websocket有断开重连机制,
重启ws_serv,这个时候再次连接浏览器
但是,这个时候ws依然可以访问成功,见下图:
这个就是断开重连机制.
我们断开ws_serv,
浏览器,也就是硬件端,也就在很慢的建立连接,其实很难达到递归深度,只要我们再次连接就可以了
这个时候,我们就可以重新建立连接了
其实这个递归是有坑的,我们如果新建一个,就会变成一个新的,就不好时了,因此我们用递归可以避免这个小坑.
这个递归,也就是websocket重连机制.
9.AppWebsocket断开重练&&MuiFire调用WS事件.
下面我们让用户也使用websocket机制进行处理.下面测试,我们用夜神
我们想要用户一登录app,就可以连接websocket,随时保持用户和服务器之间连接
我们将websocket页面写在index界面比较合理
下面我们叫它一上就连接上
我们看到上图是在登录.
登录成功,应该如何处理呢?
下面,我们发歌,怎么发呢?
我们想要区分玩具发送,明天处理.
我们现在处理,随便给一个发送"小粪球",这个分地方先写死
我们先用5a对应的id 5cc070f027c41e4d8891fe52
下面,我们再用fire时间进行处理:
打包之前一定要替换
下面,我们在最后进行监听一下:
渡尽劫波兄弟在,相逢一笑泯恩仇!完工
重启前后端项目,浏览器端先放入玩具的device_key,HBuilder放_id信息
下面,我们做一下区分一下:
下面,我们在传递一下;(这个是专门针对浏览器进行的操作)
虽然与实际业务没有什么关系,但是目的就是做好区分工作
再次开机,输入下面的内容
d056b7666e43bf1b4e19b3d9b4552b5a