Qooxdoo应用连接SQLite数据库失败,求解决步骤及代码示例
解决qooxdoo通过Jsonp连接Bottle+SQLite的问题
问题定位
直接访问/getData接口正常,但qx.io.request.Jsonp请求后端无响应,核心原因是Jsonp请求要求后端返回带回调函数包裹的JSON数据,而当前后端仅返回纯JSON,同时前端可能未正确配置Jsonp的回调参数。
修正后的前端qooxdoo代码
// 初始化Jsonp请求实例 var jsonpReq = new qx.io.request.Jsonp(); // 设置完整的后端接口地址 jsonpReq.setUrl("http://address.es:8080/idCars/getData"); // 指定后端需读取的回调参数名(需与后端逻辑匹配) jsonpReq.setCallbackParam("callback"); // 监听请求成功事件,处理返回数据 jsonpReq.addListener("success", function(e) { var rawData = e.getTarget().getResponse(); console.log("获取到SQLite数据:", rawData); // 此处添加数据渲染、业务逻辑处理代码 }, this); // 监听请求失败事件,排查错误 jsonpReq.addListener("failure", function(e) { console.error("请求失败,状态码:", e.getTarget().getStatusCode()); }, this); // 发送请求 jsonpReq.send();
适配Jsonp的Bottle后端代码
from bottle import Bottle, request, response import sqlite3 import json app = Bottle() @app.route('/idCars/getData') def fetch_sqlite_data(): # 连接SQLite数据库(确保文件路径正确) conn = sqlite3.connect('cars_db.db') conn.row_factory = sqlite3.Row # 直接返回字典格式数据 cursor = conn.cursor() # 执行SQL查询(示例:查询车辆表所有数据) cursor.execute("SELECT * FROM cars") data_rows = cursor.fetchall() # 转换为可序列化的字典列表 result_list = [dict(row) for row in data_rows] conn.close() # 处理Jsonp回调逻辑 callback_name = request.query.get('callback') if callback_name: # 返回带回调包裹的响应,Content-Type设为JS类型 response.content_type = 'application/javascript' return f"{callback_name}({json.dumps(result_list)})" else: # 兼容普通JSON请求 response.content_type = 'application/json' return json.dumps(result_list) if __name__ == '__main__': app.run(host='0.0.0.0', port=8080, debug=True)
关键解决步骤
- 前端配置校验:确保Jsonp请求的
callbackParam参数名与后端读取的参数完全一致,请求URL包含完整的域名、端口和接口路径。 - 后端Jsonp适配:在接口中主动读取请求的
callback参数,存在时返回回调函数(序列化数据)格式的响应,同时设置正确的Content-Type。 - SQLite连接检查:确认数据库文件路径正确,运行后端的用户有文件读写权限,SQL查询语句无语法错误。
- 跨域验证:Jsonp本身支持跨域请求,若仍有问题,检查后端是否存在额外的跨域拦截配置。
内容的提问来源于stack exchange,提问作者Jesús González
相关产品推荐
相关产品推荐

