文章目录
- 记录基于ARM的铝片缺陷检测项目的经历(二)
- 利用flask框架搭建微型服务器
- 一、接收客户端上传的图片进行检测
- 二、将检测结果图片和数据下载到客户端
- 三、其他问题
前一节已经将模型训练完毕了,接下来就是前后端的搭建和数据传输
利用flask框架搭建微型服务器语言:python3.8
框架:Flask ( version == 2.1.2 )
测试平台:window10
构建流程:
- 接收客户端上传的图片
- 将图片送至模型进行检测
- 将检测图片和检测数据下载至客户端
一、接收客户端上传的图片进行检测
首先介绍文件夹格式
build目录用来存放将来linux系统的执行文件
static目录下的images目录用来存放用户上传来的待检测图片,result目录用来存放后台检测结果数据。
templates目录下存放客户端的html源代码
而服务器代码文件存放在根目录下
当用户访问我们服务器时,我返回一个初始网页模板给客户端。
return render_template('upload.html')
在html代码中,用户选择的待检测图片将会以表单的形式用POST方式上传文件至服务端,所以我们在服务端用flask框架中的request方法得到用户上传的待检测图片。
if request.method == 'POST':
f = request.files['file']
将static/images目录清空,再将得到的待检测图片改名为test.jpg存放在static目录的Images目录下。
basepath = os.path.dirname(__file__) #
filepath = os.path.join(basepath, 'static/images')
del_list = os.listdir(filepath)
for f in del_list:
file_path = os.path.join(filepath, f)
if os.path.isfile(file_path):
os.remove(file_path)
再利用检测模型检测我们刚刚得到的待检测图片。并返回给用户另外一个网页模板。
if request.method == 'POST':
f = request.files['file']
if not (f and allowed_file(f.filename)):
return jsonify({"error": 1001, "msg": "only png、PNG、jpg、JPG、bmp"})
user_input = request.form.get("name")
upload_path = os.path.join(basepath, 'static/images', secure_filename(f.filename))
f.save(upload_path)
os.rename(upload_path, os.path.join(basepath, 'static/images', 'test.jpg'))
os.chdir("*.sh文件存放的绝对路径")
os.system("./run.sh")
return render_template('upload_ok.html', userinput=user_input, val1=time.time())
在服务端检测到客户端以POST方式上传文件时,我简单的检测了一下用户上传的文件是否是图片形式,如果不是图片形式的话,我就返回给客户端一个错误提醒。
if not (f and allowed_file(f.filename)):
return jsonify({"error": 1001, "msg": "only png、PNG、jpg、JPG、bmp"})
并在
此部分整体代码如下
app = Flask(__name__)
@app.route('/index', methods=['POST', 'GET']) #
def upload():
basepath = os.path.dirname(__file__) #
filepath = os.path.join(basepath, 'static/images')
del_list = os.listdir(filepath)
for f in del_list:
file_path = os.path.join(filepath, f)
if os.path.isfile(file_path):
os.remove(file_path)
if request.method == 'POST':
f = request.files['file']
if not (f and allowed_file(f.filename)):
return jsonify({"error": 1001, "msg": "only png、PNG、jpg、JPG、bmp"})
user_input = request.form.get("name")
upload_path = os.path.join(basepath, 'static/images', secure_filename(f.filename))
f.save(upload_path)
os.rename(upload_path, os.path.join(basepath, 'static/images', 'test.jpg'))
os.chdir("*.sh文件存放的目录的绝对路径")
os.system("./run.sh")
return render_template('upload_ok.html', userinput=user_input, val1=time.time())
return render_template('upload.html')
二、将检测结果图片和数据下载到客户端
首先介绍一下服务端数据下载到客户端的原理:
利用flask框架可以将你指定的数据通过functoin的return发送到你指定的网址上,具体为: 你的Ipv4地址:你设定的端口号/你设定的网址
具体在我的检测结果数据发送,我设定的网址为: 192.168.44.21:8080/ResultData
其中192.168.44.21是我本机的Ipv4地址(没错,我是用自己的电脑做为服务端进行测试的),开放的端口号为8080端口,设定的网址是/ResultData
@app.route("/ResultData")
所以当服务端发送数据到指定网址后,只需要在html代码中访问这个网址后就能得到服务端发送的数据。相当于这个网址是服务端和客户端页面的中转站。
首先我将检测后的结果数据传到了 192.168.44.21:8080/ResultData 上。
就是一个简单的文件输入流读取文件内容后,将内容发送出去。
@app.route("/ResultData")
def giveData():
basePath = os.path.dirname(__file__) #
resultDataPath = "*结果数据所在地址的路径"
dataList = []
dataDict = {}
i = 0
with open(resultDataPath, "r", encoding="utf-8") as f:
data = f.readline()
while data:
dataDict[str(i)] = dict(result=data)
i += 1
try:
data = f.readline().strip()
except:
break
dataList.append(dataDict)
return str(dataList).replace("'", '"')
接着将结果图片发送到 192.168.44.21:8080/dada
@app.route("/dada", methods=['GET', 'POST'])
def showImg():
if flask.request.method == 'GET':
image_data = open("*结果图片地址", "rb").read()
response = flask.make_response(image_data)
response.headers['Content-Type'] = 'image/png'
return response
三、其他问题
在实际 *** 作中我发现一个问题,每次重启服务端时,服务端的ip地址会变化(就是我本机的IP地址一直变化),每次发送的数据都被发送到了不同的地址,那每次在html中都要重新手动修改Ajax请求的地址,这样显然不“自动化”,所以我写了一个脚本,每次启动服务端时会自动得到服务端的IP地址。
先放代码:
# -*- coding:utf-8 -*-
import os
import re
def getIpPath():
# 使用os.popen()函数执行ifconfig命令,结果为file对象,将其传入cmd_file保存
cmd_file = os.popen('ipconfig')
# 使用file对象的read()方法获取cmd_file的内容
cmd_result = cmd_file.read()
# print(cmd_result)
# print(type(cmd_result)) # str
# 构造用于匹配IP的匹配模式
obj = re.compile(r'无线局域网适配器.*?IPv4.*?:(?P.*?)子网掩码' , re.S)
ipIter = obj.finditer(cmd_result)
with open("./static/result/ipPath.txt", "w", encoding="utf-8") as f:
for ip in ipIter:
ipPath = ip.group("ip").strip()
# print(ipPath)
path = "http://{}:8081/".format(ipPath)
f.write(path)
return ipPath
在windows终端中查看IP的方式是:
ipconfig
所以利用os库的os.popen()的管道式输入ipconfig,读取返回的内容(就是在终端输入ipconfig后显示的一大串信息),格式为str,可以放心让re库食用
接着利用re正则表达式来截取Ipv4的地址
obj = re.compile(r'无线局域网适配器.*?IPv4.*?:(?P.*?)子网掩码' , re.S)
ipIter = obj.finditer(cmd_result)
最后将地址加设定的端口号写入txt文件中保存,方便每次html代码中读取地址。
到此,一个非常简洁的服务端基本构建完成了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)