Flask部署猫鱼分类模型调用/predict接口出现404错误求助
Flask猫鱼分类模型接口404错误排查与修复
问题描述
我编写了一个用于练习Flask部署的猫鱼分类深度学习模型,按步骤启动Flask应用后,在浏览器调用/predict接口时返回「请求的URL未找到」错误,无法正常使用。
相关代码
from io import BytesIO import requests import torch from flask import Flask, jsonify, request from PIL import Image from torchvision import transforms from catfish_model import catfish_classes, catfish_model def load_model(): m = catfish_model m.eval() return m load_model() img_transforms = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) def create_app(): app = Flask(__name__) @app.route("/") def status(): return jsonify({"status": "ok"}) @app.route("/predict", methods=['GET', 'POST']) def predict(): if request.method == 'POST': img_url = request.form.image_url else: img_url = request.args.get('image_url', '') response = requests.get(img_url) img = Image.open(BytesIO(response.content)) img_tensor = img_transforms(img).unsqueeze(0) prediction = model(img_tensor) predicted_class = CatfishClasses[torch.argmax(prediction)] return jsonify({"image": img_url, "prediction": predicted_class}) return app def main(): app = create_app() app.run(debug=True) if __name__ == "__main__": main()
启动命令
set FLASK_APP=catfish_server.py flask run --port=8080
调用方式(错误示例)
127.0.0.1:8080/predict image_url=https://www.augsburger-allgemeine.de/img/bilder/crop55113376/4006562429-cv16_9-w1880/Bailey-aus-Gundelfingen.jpg
错误信息
请求的URL未找到。如果您手动输入了URL,请检查拼写并重试。
错误原因及修复方案
1. GET请求参数格式错误
当前调用方式不符合HTTP GET请求规范,参数需要以?开头,正确格式应为:
127.0.0.1:8080/predict?image_url=https://www.augsburger-allgemeine.de/img/bilder/crop55113376/4006562429-cv16_9-w1880/Bailey-aus-Gundelfingen.jpg
2. 模型变量未正确赋值
load_model()函数调用后未将返回的模型实例赋值给model变量,导致predict函数中model(img_tensor)会触发未定义错误。修改代码:
# 原代码 load_model() # 修改为 model = load_model()
3. 类名大小写不匹配
导入的类列表是catfish_classes,但代码中误写为CatfishClasses,会触发NameError。修正为:
predicted_class = catfish_classes[torch.argmax(prediction)]
4. POST参数获取方式存在崩溃风险
request.form.image_url在参数不存在时会抛出KeyError,改用get方法避免崩溃:
if request.method == 'POST': img_url = request.form.get('image_url', '')
5. 未捕获图片处理异常
若图片URL无效、无法下载或不是合法图片,代码会直接崩溃,添加异常捕获提升鲁棒性:
try: response = requests.get(img_url) response.raise_for_status() # 检查HTTP请求是否成功 img = Image.open(BytesIO(response.content)) except Exception as e: return jsonify({"error": str(e)}), 400
内容的提问来源于stack exchange,提问作者user16617311
相关产品推荐
相关产品推荐

