Flask后端GET请求返回JSON遇500错误,需实现IoT灯状态实时更新
Flask GET请求返回JSON解决500错误方案
核心问题排查
500是服务器内部错误,先启动Flask debug模式(app.run(debug=True))查看控制台的详细报错信息,以下是最常见的几个问题及解决方法:
1. 未使用jsonify包装响应
Flask不能直接返回Python字典,必须用flask.jsonify生成标准JSON响应,否则会触发500错误。
错误示例:
@app.route('/light/status') def get_light_status(): return {"status": "on"} # 直接返回字典会报错
修正代码:
from flask import Flask, jsonify app = Flask(__name__) @app.route('/light/status', methods=['GET']) def get_light_status(): # 模拟从硬件/数据库获取灯状态的逻辑 light_data = { "status": "on", "brightness": 75, "color": "white" } # 用jsonify包装后返回 return jsonify(light_data) if __name__ == '__main__': app.run(host='0.0.0.0', debug=True) # 内网部署用0.0.0.0,debug模式看报错
2. 业务逻辑抛出未捕获异常
如果获取灯状态的代码(比如读取硬件、数据库)出错,会直接触发500错误,需要添加异常捕获:
@app.route('/light/status', methods=['GET']) def get_light_status(): try: # 替换成你的实际硬件读取逻辑 light_data = read_light_hardware_status() return jsonify({"success": True, "data": light_data}) except Exception as e: # 返回错误信息,方便前端排查 return jsonify({"success": False, "error": str(e)}), 500
3. 路由未明确指定GET方法
虽然Flask默认路由支持GET,但显式指定methods=['GET']可以避免后续添加POST接口时的冲突。
前端AJAX实时更新示例
XMLHttpRequest原生写法
<div>当前灯状态:<span id="light-status">加载中...</span></div> <script> function refreshLightStatus() { const xhr = new XMLHttpRequest(); xhr.open('GET', '/light/status', true); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 400) { const res = JSON.parse(xhr.responseText); // 更新页面显示 document.getElementById('light-status').textContent = res.status; } else { console.error('请求失败,状态码:', xhr.status); } }; xhr.onerror = function() { console.error('网络请求出错'); }; xhr.send(); } // 每3秒刷新一次状态 setInterval(refreshLightStatus, 3000); </script>
调试技巧
- 直接在浏览器地址栏访问
http://你的内网IP:端口/light/status,确认后端能正常返回JSON,排除前端问题。 - 打开浏览器开发者工具(F12)的Network标签,查看GET请求的响应内容,服务器返回的错误信息会直接显示在这里。
内容的提问来源于stack exchange,提问作者zealotben
相关产品推荐
相关产品推荐

