如何用Python Flask/Django处理The Things Stack webhook发往本地的JSON POST请求
问题解决方法
错误原因
- 405状态码是因为Flask路由默认仅支持GET请求,没有显式声明允许POST方法
- 当前代码没有适配The Things Stack的webhook路径,也没有JSON解析逻辑
- 注意核对你The Things Stack后台配置的webhook路径:你之前标注的规则是上行消息走
/uplink-message、入网确认走/join-accept,但当前收到的请求路径是/uplink-enabled,请先确认后台配置的路径是否正确
修改后可直接使用的Flask代码
from flask import Flask, request, jsonify app = Flask(__name__) # 适配上行消息路径,同时允许GET(测试用)和POST请求 @app.route('/uplink-message', methods=['GET', 'POST']) def handle_uplink(): if request.method == 'POST': # 解析请求中的JSON数据 request_data = request.get_json() # 控制台打印完整JSON数据,方便调试 print("收到上行消息,JSON内容如下:") print(request_data) # 返回200状态码和响应,告诉The Things Stack接收成功 return jsonify({"status": "success", "message": "uplink received"}), 200 # GET请求用于快速测试服务是否正常 return "上行消息接口正常运行", 200 # 适配入网确认路径 @app.route('/join-accept', methods=['GET', 'POST']) def handle_join_accept(): if request.method == 'POST': request_data = request.get_json() print("收到入网确认消息,JSON内容如下:") print(request_data) return jsonify({"status": "success", "message": "join accept received"}), 200 return "入网确认接口正常运行", 200 # 如果确实需要/uplink-enabled路径,添加对应路由即可 @app.route('/uplink-enabled', methods=['GET', 'POST']) def handle_uplink_enabled(): if request.method == 'POST': request_data = request.get_json() print("收到/uplink-enabled请求,JSON内容如下:") print(request_data) return jsonify({"status": "success"}), 200 return "/uplink-enabled接口正常运行", 200 if __name__ == '__main__': # 监听所有网卡的80端口,确保ngrok可以访问到 app.run(debug=True, host='0.0.0.0', port=80)
配置验证要点
- 运行代码前确保80端口没有被其他程序占用
- ngrok的配置无需修改,你当前的转发规则已经正确指向
http://localhost:80 - 可以通过ngrok提供的本地Web界面
http://127.0.0.1:4040查看所有转发的请求内容,方便调试 - 确认The Things Stack后台配置的webhook路径与代码中的路由一致,即可正常接收解析JSON数据
内容的提问来源于stack exchange,提问作者Marco Bob
相关产品推荐
相关产品推荐

