第一个项目的踩坑总结
在大一上的一个寒假里参与了一个项目中拍图搜题的后台部分,由于是第一次参与项目,踩了不少坑,简单的总结一下
与前端交互最好不要使用socket通信
原因1
前端通常使用js或者vue.js等各种模板,这里面的websocket模块和python的socket模块是不一样的,python的socket协议中不需要握手,而websocket中需要一次握手,经过实验,需用上以下代码。
print('Accept new connection from %s:%s...' % addr)
receivedData = str(sock.recv(2048))
print(receivedData)
entities = receivedData.split("\\r\\n")
Sec_WebSocket_Key = entities[12].split(":")[1].strip() + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
print(Sec_WebSocket_Key)
# print("key ", Sec_WebSocket_Key)
response_key = base64.b64encode(hashlib.sha1(bytes(Sec_WebSocket_Key, encoding="utf8")).digest())
response_key_str = str(response_key)
response_key_str = response_key_str[2:30]
# print(response_key_str)
response_key_entity = "Sec-WebSocket-Accept: " + response_key_str + "\r\n"
sock.send(bytes("HTTP/1.1 101 Web Socket Protocol Handshake\r\n", encoding="utf8"))
sock.send(bytes("Upgrade: websocket\r\n", encoding="utf8"))
sock.send(bytes(response_key_entity, encoding="utf8"))
sock.send(bytes("Connection: Upgrade\r\n\r\n", encoding="utf8"))
print("send the hand shake data")
其中Sec_WebSocket_Key的获取方式或许会随着其不同的握手信息而改变,需要自己进行修改。
原因2
在经历千辛万苦接收到前端发送过来的信息后,会发现此信息不能被成功解码(尝试过常见的解码方式都不能被解出)
原因3
此外,socket通信接收信息时一次性最多只能读取其缓存区内的全部信息,也就是说希望通过recv(200000)诸如此类的指令一次性取地全部信息是无效的,并且可能发生文件不能被完全接收,并且此bug不会被报错是很难被调试出来的(在本地接收到信息是完整的,而在服务器上接收到的信息却是不完整的,可用hash进行验证)。
原因4
因此综上,只能通过分次接收获得如base64编码的长字节信息,而如果要让服务端停止通信,必须要在客户端将此次通信结束,这对接下来服务端向客户端发送数据造成了极大的不便
因此,极力推荐通过flask等框架进行通信,使用socket磨了半星期的我就是个sb
最好有一个服务器
只有有了服务器才能让前端与后端进行通信,否则只能在127.0.0.1内使用,不能让外网访问。
数据格式最好采用通用的格式如json
不同的语言其内置造成数据类型可能是不同的,如果因为数据格式不兼容而造成与前端交互的不便就得不偿失了
服务器上的python版本
服务器自带的大多是python2.x版本,在抄网上教程时不能不带脑子的原样照搬,否则可能不仅不能成功切换的版本,而且在经历多个教程的洗礼后服务器上的环境会越来越混乱让你心烦意乱555
记忆中踩过比较深刻的坑大概是这么几个,事实上在这个本以为easy的小项目中踩过无数的坑,想到这就非常感谢已经毕业的课外老师兼大佬学长(给的东西都非常靠谱),虽然总是骂人但也会答复我的sb问题的可爱部长,还有耐心的前端学长对我这萌新的包容,如果不是他们我可能会在这个项目上浪费更多的时间,或许最好还不能成功完成这个项目。