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

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_array
    
    然后修改为:
    x = 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')

验证步骤

  1. 安装依赖:确保已安装flask-cors、tensorflow、pillow等包
  2. 启动后端服务
  3. 前端选择图片后点击提交,检查浏览器控制台和后端日志排查问题

内容的提问来源于stack exchange,提问作者Promatheuz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:31:04