python - 尝试通过 ifttt 将谷歌助手集成到 python 来学习和测试一些东西
问题描述
我正在尝试做一个监听器,看看我通过 ifttt 发布的内容,但我收到了错误的请求 (400) 错误。这是代码:
from flask import Flask, abort, request
import json
app = Flask(__name__)
@app.route('/foo', methods=['POST'])
def foo():
if not request.json:
abort(400)
print(request.json)
return json.dumps(request.json)
if __name__ == '__main__':
app.run(host='192.168.1.10', port=27015, debug=True)
我究竟做错了什么?
解决方案
这听起来像一个客户端问题。
发布数据的客户端需要设置以下标头:
'Content-Type': 'application/json'
否则request.json
返回None
代码中的 which 将触发abort(400)
.
如果无法在客户端进行所需的更改,可以使用 的get_json()方法request
,并通过force=True
. 如果实际有效负载的解析失败,它将引发BadRequest
异常。
更好的写法是:
from flask import jsonify, abort
@app.route('/foo', methods=['POST'])
def foo():
try:
output = request.get_json(force=True)
except:
abort(400)
# output is now a dict of the incoming json payload
print(output)
return jsonify(output)
然后使用有效载荷进行测试(但没有设置内容类型标头):
$ curl http://localhost:5000/foo -X POST -d '{"one":"two"}'
{
"one": "two"
}
和一个无效的有效载荷:
$ curl http://localhost:5000/foo -X POST -d '{"one":"two3}'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
jsonify()
在传出数据上使用烧瓶的功能会在输出时自动设置正确的内容类型。
编辑,如果您不确定哪些数据到达端点,并且只能在控制台中看到 400 响应,那么也许可以尝试将功能剥离回基础:
@app.route('/foo', methods=['POST'])
def foo():
print(request.get_json(force=True))
return 'works'
这里可能需要进行一些试错测试。尝试通过您的ifttt
系统以及上面的 curl 命令提交。
推荐阅读
- flutter - 颤振错误LateInitializationError:字段'animationStatus'尚未初始化
- reactjs - 如何在电容器顶部运行的 React Ionic 项目中插入图像?
- jasmine - 在另一个函数中模拟一个函数
- java - 使用java提取日志文件中两个时间戳之间的行
- python - 使用最小堆的列表中的第 K 个最大元素
- reactjs - 如何将(手动)接口构造从 React tsx 翻译成 React jsx?
- triggers - 在 arm 模板中使用时区触发 azure 数据工厂无法正常工作
- reactjs - 使用 DualList 组件呈现和添加数据时出现问题
- firebase - Firebase 可调用函数失败
- typescript - 打字稿扩展原始类型