Flask接口无法响应AJAX请求:TypeError无效响应问题排查求助
排查Flask视图函数返回无效响应及AJAX请求问题
看起来你的问题主要出在两个关键地方:SQL查询的逻辑错误,以及Flask视图返回的响应不符合AJAX的预期,下面一步步帮你梳理和修正:
1. SQL查询的逻辑错误
你当前的查询语句:
select_query = '''SELECT processed, output_text FROM results WHERE token = token '''
这里有个致命问题:等式两边的token都会被SQL解析为列名,相当于判断token列的值等于它自己,这会返回表中所有记录,而不是匹配你传入的token值。同时这种写法还存在SQL注入风险。
正确的做法是使用Flask推荐的参数化查询,把参数和SQL语句分开:
select_query = '''SELECT processed, output_text FROM results WHERE token = ?''' # 把token作为参数传入execute方法,避免注入问题 cur.execute(select_query, (token,))
这样就能精准匹配到对应token的记录了。
2. Flask视图的响应不符合AJAX需求
你的AJAX请求明确指定了datatype: "json",期望接收JSON格式的数据,但你当前的视图函数返回的是:
return redirect(url_for('questgen', data = data))
这是一个HTTP重定向响应(状态码3xx),完全不符合AJAX的预期。而且如果questgen视图函数没有正确处理传入的data参数,甚至可能返回None,这就直接触发了你看到的TypeError。
正确的做法是直接返回JSON格式的响应,需要导入jsonify工具:
from flask import jsonify # ... 中间数据库操作代码 ... data = {'processed': processed, 'html' : html} # 返回JSON格式的响应,适配AJAX的需求 return jsonify(data)
这样AJAX的success回调就能正确解析返回的数据,执行后续的DOM渲染操作。
3. 额外的优化与检查点
- 当数据库中没有匹配token的记录时,
processed和html会保持初始的空字符串,建议在这种情况下返回明确的状态,比如:if not records: data = {'processed': 0, 'html': 'No matching results found'} else: # 你的现有赋值逻辑 processed = row[0] html = row[1] data = {'processed': processed, 'html' : html} - 确认
token参数确实被正确获取:可以在视图函数里打印token的值,检查它是不是None或者空字符串,避免因为参数没传导致查询无结果。
修改完这些点后,重新测试AJAX请求,同时查看Flask控制台的日志,确认token被正确接收、SQL查询返回了预期的记录,应该就能解决当前的问题了。
内容的提问来源于stack exchange,提问作者Raza Ul Haq
相关产品推荐
相关产品推荐

