项目场景:
原先网站使用前端vue+后端express构建的,现有需求,前端的表单数据要调用python的算法,完成基于机器学习的分类任务,再将分类结果返回给前端,因此需要开启第二个后端的服务,该服务是基于python的,项目中选择flask作为后端框架(比较简易),目的就是接受前端的这个post请求,将post请求的数据作为输入,输入进相应模型,返回的结果打包为json数据给前端渲染。
项目简介
如下是前端vue要传的数据
如下为封装的toLyPredict接口(存在问题,属于问题2的post封装问题,后面会解决)

如下为后端flask的配置:
不需要设置页面,因为它的目的就是处理这个表单请求,调用算法,返回相应数据给前端


问题描述即解决方法
提示:这里描述项目中遇到的问题:
问题1:跨域问题
问题1-原因分析:
问题1:这个是由于前后端分离,服务的端口号不同导致的,前端服务在127.0.0.1:8080上,原先的express后端服务在127.0.0.1:3001上(express跨域问题使用cors中间件解决的),现在多了一个后端服务在flask的127.0.0.1:3002上,而先前flask中未设置跨域相关代码,因此存在跨域问题
此时提交表单,发现如下报错,提示跨域问题has been blocked by CORS policy
问题1-解决方案:
在后端flask中设置cors
解决了问题1,但是出现了如下的问题
问题2:flask后端可以收到post的请求,但无法获取请求中的数据
提交表单后,前端显示的错误500,表示服务器内部错误(于是去flask终端检查错误)
检查flask终端,发现可以收到前端发来的post请求,但是通过print(request.form)发现,获得的是空数据
问题2-原因分析
这是由于post请求的解析问题,原先使用vue+express时,前端封装post请求时没有设置content-type,因为可以直接在后端express中引入中间件body-parse来解析获取post请求的body中的数据(不需要考虑请求头中的content-type);而现在为发往flask后端的post请求,无法直接解析,flask只能识别请求头中的content-type为application/x-www-form-urlencoded或者multipart/form-data的post数据(通过postman接口测试发现,通过上述两种content-type,可以正确解析post请求,并返回数据,说明这是前端vue的post封装问题)
检查前端的network部分,我们可以看到,vue封装的post请求的content-type默认为application/json,此种请求flask无法解析,因此需要我们在vue中重新封该post请求,设置headers中的content-type
![在这里插入图片描述](https://img-blog.csdnimg.cn/30e4ac575d2f4884a6c94d4d2c3e5a57.p
问题2-解决方案:
前端的封装接口处增加如下红框处代码,设置headers中的content-type为application/x-www-form-urlencoded或者multipart/form-data,这样flask就可以正确的解析获取post请求中附带的数据。
此时flask后端能正确获取数据