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

Flask应用SQLite查询返回None但取[0]有值的异常排查

问题分析与解决

核心原因

你遇到的问题本质是:当请求的token在数据库中不存在时,fetch_file会返回None,此时执行exten[0]就会触发NoneType下标错误。你测试的MZ是有效token,能正常返回结果,所以功能看似正常,但其他无效请求(比如浏览器自动发起的/favicon.ico请求)会触发这个错误,导致日志报错。

另外,fetch_file的异常处理返回的是带颜色的字符串,如果数据库出现错误,exten会变成字符串,执行exten[0]虽然不会报NoneType错误,但逻辑完全不符合预期,这也是潜在隐患。

修复方案

1. 修改Flask路由代码,增加前置校验

在使用exten前先检查是否为有效结果,避免下标错误:

@app.route("/<token>")
def disp(token):
    exten = dbmgr.fetch_file(token)
    # 先判断是否为数据库返回的有效元组结果
    if not isinstance(exten, tuple):
        # 处理无效token或数据库错误的情况
        return "无效链接或文件不存在"
    
    print(exten[0])
    flnm = f"./uploads/{token}.{exten[0]}"
    if os.path.isfile(flnm):
        return send_file(flnm)
    else:
        return "nope"

2. 优化fetch_file方法(可选但推荐)

让方法返回值更统一,出现异常时抛出错误而非返回字符串,方便上层统一处理:

def fetch_file(self, token):
    with self.connect() as db:
        try:
            cursor = db.cursor()
            cursor.execute("SELECT Exten FROM FILE_SHARE WHERE TOKEN = ?;", (token,))
            result = cursor.fetchone()
            return result
        except s.Error as e:
            # 抛出异常,交给上层路由捕获处理,而非返回字符串
            raise RuntimeError(f"获取文件扩展名失败: {token}") from e

之后在路由中增加异常捕获逻辑:

@app.route("/<token>")
def disp(token):
    try:
        exten = dbmgr.fetch_file(token)
        if not exten:
            return "无效链接或文件不存在"
        
        print(exten[0])
        flnm = f"./uploads/{token}.{exten[0]}"
        if os.path.isfile(flnm):
            return send_file(flnm)
        else:
            return "nope"
    except RuntimeError as e:
        print(e)
        return "服务器内部错误"

验证效果

测试无效token(比如随便输入一个不存在的),此时不会再触发TypeError,而是返回预设的提示;有效token仍能正常展示文件,同时日志不会出现报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:06:16