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

使用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']一致

四、通用排查清单

  1. 检查Flask控制台输出,是否有权限错误、文件格式错误等日志
  2. 确认上传文件大小未超过MAX_CONTENT_LENGTH限制
  3. Kivy端与后端是否在同一网络,后端防火墙是否开放对应端口(默认5000)
  4. 测试用简单文件(如小尺寸jpg)排除大文件问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:20:16