Flutter调用Flask接口遇Error 405,Postman请求正常
问题分析与解决方案
核心问题1:跨域预检请求未处理
Flutter发起跨域POST请求时,会先发送OPTIONS预检请求验证权限,但你的Flask路由仅允许POST方法,未处理OPTIONS请求,导致服务器返回405 Method Not Allowed错误。而Postman不会触发预检请求,直接发送POST所以能成功。
核心问题2:Flask启动配置重复
代码中两次调用app.run(),实际只有第一次app.run(debug=True)生效(默认运行在localhost:5000),第二次app.run(host='10.0.2.2', port=8000)不会执行,这会导致Flutter请求的目标地址无服务运行,进一步引发异常。
核心问题3:参数获取方式不规范
路由定义为POST方法,但使用request.args获取参数(这是GET请求的URL查询参数),如果Flutter将参数放在请求体(如JSON)中,会导致无法正确获取参数。
具体修复步骤
1. 安装并配置Flask-CORS处理跨域
先安装flask-cors依赖:
pip install flask-cors
修改Flask代码,添加CORS配置并修复路由:
from flask import Flask, request, jsonify from flask_cors import CORS # 导入CORS模块 import pickle import numpy as np model = pickle.load(open('model1.pkl','rb')) app = Flask(__name__) CORS(app) # 允许所有跨域请求,生产环境可限定具体域名 @app.route('/predict',methods=['POST', 'OPTIONS']) # 添加上OPTIONS方法支持 def predictor(): # 处理OPTIONS预检请求,直接返回成功状态 if request.method == 'OPTIONS': return '', 200 # 从JSON请求体中获取参数(适配Flutter的常规请求方式) data = request.get_json() area = int(data['area']) bedrooms = int(data['bedrooms']) psf = float(data['psf']) feature_score = int(data['feature_score']) LocationPremium = float(data['LocationPremium']) LogPremium = float(data['LogPremium']) query = np.array([[area, bedrooms, psf, feature_score, LocationPremium, LogPremium]]) result = model.predict(query)[0] return jsonify({'prediction': str(result)}) if __name__ == '__main__': # 合并启动参数,仅调用一次app.run app.run(debug=True, host='10.0.2.2', port=8000)
2. 调整Flutter请求代码(确保发送JSON格式)
确保Flutter的POST请求以JSON格式发送参数,示例代码:
import 'dart:convert'; import 'package:http/http.dart' as http; Future<void> sendPredictRequest() async { final url = Uri.parse('http://10.0.2.2:8000/predict'); final response = await http.post( url, headers: {'Content-Type': 'application/json'}, body: jsonEncode({ 'area': 100, 'bedrooms': 2, 'psf': 5000.0, 'feature_score': 8, 'LocationPremium': 1.2, 'LogPremium': 0.5, }), ); if (response.statusCode == 200) { final data = jsonDecode(response.body); print('预测结果:${data['prediction']}'); } else { print('请求失败:${response.statusCode}'); } }
3. Postman测试适配(可选)
如果继续用Postman测试,选择POST方法,在Body标签下选raw->JSON,输入参数:
{ "area": 100, "bedrooms": 2, "psf": 5000.0, "feature_score": 8, "LocationPremium": 1.2, "LogPremium": 0.5 }
内容的提问来源于stack exchange,提问作者R3hankhan
相关产品推荐
相关产品推荐

