Flask POST请求触发405 Method Not Allowed错误求助
解决Flask POST请求405 Method Not Allowed错误及代码修正
一、405错误核心原因与解决
你的405错误是跨域预检请求(OPTIONS)未被处理导致的:浏览器发起跨域POST请求前,会先发送OPTIONS请求确认服务器是否允许跨域操作,但你的/predict路由只配置了POST方法,没有处理OPTIONS,因此返回405。
解决方式1:手动处理OPTIONS请求
修改路由配置,添加OPTIONS方法并处理预检响应:
@app.route('/predict', methods=["POST", "OPTIONS"]) def predict(): if request.method == "OPTIONS": response = jsonify({"message": "Preflight OK"}) response.headers.add('Access-Control-Allow-Methods', 'POST, OPTIONS') return response # 原POST请求处理逻辑...
解决方式2:使用Flask-CORS扩展(更简便)
先安装扩展:
pip install flask-cors
再在代码中引入并初始化:
from flask import Flask, request, jsonify from flask_cors import CORS # 新增导入 # ...其他导入代码... app = Flask(__name__) CORS(app) # 全局启用跨域,自动处理OPTIONS请求 # ...后续路由代码...
此方式无需手动修改路由,扩展会自动处理所有跨域相关请求头和预检操作。
二、代码中其他致命错误修正
即使解决了405,你的代码还存在多处错误,会导致请求处理失败:
1. 前端请求体格式错误
前端predictImage函数中,JSON.stringify(image)会把图片base64字符串直接转为JSON字符串,但后端期望包含image字段的JSON对象,修改为:
function predictImage(image) { fetch("/predict", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ image: image }) // 改为对象格式 }) // ...后续逻辑不变... }
2. 后端图片预处理错误
img.img_to_array(img):PIL Image对象没有img_to_array方法,需导入Keras预处理函数:
然后修改为:from tensorflow.keras.preprocessing.image import img_to_arrayx = img_to_array(img)preds = model.predict(img, model):model.predict参数错误,应传入预处理后的数组x,修改为:preds = model.predict(x)
3. 其他细节修正
- 类别拼写错误:
gluacoma改为glaucoma - 返回结构化结果,方便前端处理:
return jsonify({ "disease": CATEGORIES[np.argmax(score)], "confidence": float(100*np.max(score)), "message": result })
修正后的完整后端代码
from flask import Flask, request, jsonify from flask_cors import CORS from PIL import Image import numpy as np import base64 import io import os import tensorflow as tf from tensorflow.keras.preprocessing.image import img_to_array from tensorflow.keras.models import load_model os.environ['CUDA_VISIBLE_DEVICES'] = '0' model = tf.keras.models.load_model("goz.model") app = Flask(__name__) CORS(app) # 启用跨域 @app.route('/predict', methods=["POST"]) def predict(): try: response = request.get_json() if not response or 'image' not in response: return jsonify({"error": "Missing 'image' field in request"}), 400 data_str = response['image'] point = data_str.find(',') if point == -1: return jsonify({"error": "Invalid base64 image format"}), 400 base64_str = data_str[point+1:] # 跳过"data:image/..."前缀 image = base64.b64decode(base64_str) img = Image.open(io.BytesIO(image)) if img.mode != 'RGB': img = img.convert("RGB") CATEGORIES = ["Cataract", "Diabetic_retinopathy", "glaucoma", "normal" ] img = img.resize((180, 180)) x = img_to_array(img) x = np.expand_dims(x, 0) x = x / 255.0 # 训练时做了归一化的话,这里同步处理 preds = model.predict(x) score = tf.nn.softmax(preds[0]) disease = CATEGORIES[np.argmax(score)] confidence = 100 * np.max(score) result = f"Bu fotograf su hastaliga benziyor: {disease} yuz uzerinden su kadar eminim: {confidence:.2f}." return jsonify({ "disease": disease, "confidence": round(confidence, 2), "message": result }) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(debug=True, host='0.0.0.0')
验证步骤
- 安装依赖:确保已安装
flask-cors、tensorflow、pillow等包 - 启动后端服务
- 前端选择图片后点击提交,检查浏览器控制台和后端日志排查问题
内容的提问来源于stack exchange,提问作者Promatheuz
相关产品推荐
相关产品推荐

