Flask /search路由加载database.db数据渲染HTML页时报内部服务器错误求解决
/search接口内部服务器错误排查与修复方案
核心报错根因
- 递归死循环(最直接触发500的原因):后端代码中模板传参写为
output=search(),路由函数search()在执行过程中会无终止地自我调用,快速触发Python递归深度上限,直接抛出运行时错误。 - 执行路径逻辑错误:手动编写的
con.close()语句放在return语句之后,永远不会被执行;且with sql.connect(...)上下文管理器本身会在代码块退出时自动完成连接提交、数据库资源释放,该手动关闭逻辑本身完全冗余。 - SQL语句潜在语法风险:查询时直接使用未转义的表名
list,该名称属于通用保留标识,部分数据库解析器会将其识别为语法关键字,直接触发查询失败。 - 前后端数据传值不匹配:未做格式化的原始查询结果直接传入模板,前端只能展示难读的原始元组字符串,无法清晰呈现结构化数据。
修正后的后端实现
import sqlite3 as sql from flask import Flask, render_template app = Flask(__name__) @app.route('/search') def search(): # 确认database.db文件路径与当前Flask应用的工作目录匹配 with sql.connect("database.db") as con: cur = con.cursor() # 表名加转义反引号,规避关键字冲突 cur.execute("SELECT * FROM `list`") query_result = cur.fetchall() # 直接将查询得到的结果传入模板,删除递归调用自身的错误逻辑 return render_template("search.html", output=query_result)
前端模板适配优化
修正原模板中多余的闭合标签,增加循环渲染逻辑,提升数据展示可读性:
{% extends "headers/header.html" %} {% block body %} <h1>Results</h1> {% if output %} {% for row in output %} <div class="result-item"> <p>字段1:{{ row[0] }}</p> <p>字段2:{{ row[1] }}</p> <p>字段3:{{ row[2] }}</p> <p>字段4:{{ row[3] }}</p> <p>字段5:{{ row[4] }}</p> </div> {% endfor %} {% else %} <p>暂无查询结果</p> {% endif %} </main> </body> {% endblock %}
调试提示:如果修正后仍出现数据库相关报错,可在连接代码段打印数据库文件的绝对路径,确认应用启动时的工作目录能正确定位到
database.db文件,避免路径匹配错误。
内容的提问来源于stack exchange,提问作者t.gf
相关产品推荐
相关产品推荐

