使用Flask后端与Kivy前端无法存储数据,请求技术帮助
问题排查与解决方案
一、Flask 后端(app.py)核心修正与示例
首先确保后端配置了合法的上传目录、文件校验逻辑,且路由处理正确:
from flask import Flask, request, send_from_directory import os from werkzeug.utils import secure_filename app = Flask(__name__) # 配置上传目录,自动创建不存在的目录 UPLOAD_FOLDER = "./uploads" app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER app.config["MAX_CONTENT_LENGTH"] = 16 * 1024 * 1024 # 限制单文件最大16MB os.makedirs(UPLOAD_FOLDER, exist_ok=True) # 允许的图片格式 ALLOWED_EXTENSIONS = {"png", "jpg", "jpeg", "gif"} def allowed_file(filename): return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS @app.route("/upload", methods=["POST"]) def upload_file(): # 检查请求是否包含文件字段 if "file" not in request.files: return "No file part in request", 400 file = request.files["file"] # 处理空文件名情况 if file.filename == "": return "No file selected", 400 # 校验文件格式并保存 if file and allowed_file(file.filename): safe_filename = secure_filename(file.filename) file.save(os.path.join(app.config["UPLOAD_FOLDER"], safe_filename)) return f"Upload success: {safe_filename}", 200 return "Invalid file type", 400 @app.route("/download/<filename>") def download_file(filename): return send_from_directory(app.config["UPLOAD_FOLDER"], filename, as_attachment=True) if __name__ == "__main__": app.run(debug=True, host="0.0.0.0") # 0.0.0.0允许局域网内设备访问
关键注意点:
- 必须保证
uploads目录存在且有写入权限(Linux/macOS 可执行chmod 777 uploads临时测试) - 使用
secure_filename处理文件名,避免路径遍历攻击 - 后端启动时指定
host="0.0.0.0",确保Kivy客户端能访问
二、Kivy 客户端(main.py)上传逻辑修正
使用 requests 发送 multipart/form-data 格式请求,确保字段名与后端匹配:
from kivy.app import App from kivy.uix.button import Button import requests import os class AvatarApp(App): def build(self): return Button(text="Upload Avatar", on_press=self.upload_avatar) def upload_avatar(self, instance): local_file = "./test_avatar.jpg" if not os.path.exists(local_file): print("Local file not found") return # 替换为你的后端地址(同一机器用localhost,不同机器用后端局域网IP) backend_url = "http://localhost:5000/upload" try: with open(local_file, "rb") as f: # 字段名'file'必须与后端request.files['file']一致 files = {"file": ("avatar.jpg", f, "image/jpeg")} resp = requests.post(backend_url, files=files) print(f"Response: {resp.text}") if resp.status_code == 200: print("Upload completed") else: print(f"Upload failed, status code: {resp.status_code}") except Exception as e: print(f"Request error: {str(e)}") if __name__ == "__main__": AvatarApp().run()
关键注意点:
- 先安装依赖:
pip install requests - 确保后端地址可访问:可在浏览器中访问
http://localhost:5000测试连通性 - 异常捕获覆盖网络不通、文件不存在等场景
三、前端页面(index.html)表单规范(若需Web端上传)
若使用Flask提供的Web页面上传,表单必须指定正确的编码类型:
<!DOCTYPE html> <title>Avatar Upload</title> <h1>Upload Avatar</h1> <form method="POST" enctype="multipart/form-data" action="/upload"> <input type="file" name="file" accept="image/*"> <button type="submit">Upload</button> </form>
关键注意点:
- 必须设置
enctype=multipart/form-data,否则无法上传文件 - 输入框的
name属性必须与后端的request.files['file']一致
四、通用排查清单
- 检查Flask控制台输出,是否有权限错误、文件格式错误等日志
- 确认上传文件大小未超过
MAX_CONTENT_LENGTH限制 - Kivy端与后端是否在同一网络,后端防火墙是否开放对应端口(默认5000)
- 测试用简单文件(如小尺寸jpg)排除大文件问题
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

