You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:54:28