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
相关产品推荐
相关产品推荐

