首页 > 解决方案 > 尝试通过 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)

我究竟做错了什么?

标签: pythonpython-3.xwebhooks

解决方案


这听起来像一个客户端问题。

发布数据的客户端需要设置以下标头:

'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 命令提交。


推荐阅读