python - 如何在 Flask 中处理 JSON?

标签 python json flask salesforce raspberry-pi

我之前已经问过一些关于这个问题的问题,但仍然没有解决我的问题。

我试图允许 Salesforce 通过 JSON(REST API)远程向 Raspberry Pi 发送命令。 Raspberry Pi 通过称为 TellStick 的 RF 发射器控制某些 RF 插头的电源。这就是所有设置,我可以使用 Python 发送这些命令。我现在需要做的就是让 Pi 接受 JSON,然后弄清楚如何从 Salesforce 发送命令。

有人好心地在 GitHub 上 fork 了我的存储库,并为我提供了一些可以使其工作的代码。但不幸的是它仍然不起作用。

这是上一个问题:How to accept a JSON POST?

这是 fork 的存储库:https://github.com/bfagundez/RemotePiControl/blob/master/power.py

我需要做什么?我已在 Postman 扩展和 cURL 中发送测试 JSON 消息,但不断收到错误。

我只是希望能够发送各种变量,并让脚本完成其余的工作。

我目前可以使用一些 URL 变量发布到 .py 脚本,因此 /python.py?power=on&device=1&time=10&pass=whatever 并计算出来。当然有一种简单的方法可以用 JSON 发送它?

这是 power.py 代码:

# add flask here
from flask import Flask
app = Flask(__name__)
app.debug = True
# keep your code
import time
import cgi
from tellcore.telldus import TelldusCore
core = TelldusCore()
devices = core.devices()

# define a "power ON api endpoint"
@app.route("/API/v1.0/power-on/<deviceId>",methods=['POST'])
def powerOnDevice(deviceId):
    payload = {}
    #get the device by id somehow
    device = devices[deviceId]
    # get some extra parameters 
    # let's say how long to stay on
    params = request.get_json()
    try:
        device.turn_on()
        payload['success'] = True
        return payload
    except:
        payload['success'] = False
        # add an exception description here
        return payload

# define a "power OFF api endpoint"
@app.route("/API/v1.0/power-off/<deviceId>",methods=['POST'])
def powerOffDevice(deviceId):
    payload = {}
    #get the device by id somehow
    device = devices[deviceId]
    try:
        device.turn_off()
        payload['success'] = True
        return payload
    except:
        payload['success'] = False
        # add an exception description here
        return payload

app.run()

最佳答案

您的deviceID变量是一个字符串,而不是整数;它包含一个 '1' 数字,但这还不是一个整数。

您可以显式转换它:

device = devices[int(deviceId)]

或者告诉 Flask 你想要在路由中使用一个整数参数:

@app.route("/API/v1.0/power-on/<int:deviceId>", methods=['POST'])
def powerOnDevice(deviceId):

其中 int: 部分是 URL route converter .

您的 View 应该返回一个响应对象、一个字符串或一个元组,而不是一个字典(就像您现在所做的那样),请参阅 About Responses 。如果您想返回 JSON,请使用 flask.json.jsonify() function :

# define a "power ON api endpoint"
@app.route("/API/v1.0/power-on/<int:deviceId>", methods=['POST'])
def powerOnDevice(deviceId):
    device = devices[deviceId]

    # get some extra parameters 
    # let's say how long to stay on
    params = request.get_json()
    try:
        device.turn_on()
        return jsonify(success=True)
    except SomeSpecificException as exc:
        return jsonify(success=False, exception=str(exc))

我还更改了异常处理程序以仅处理特定异常;尽量避免Pokemon exception handling ;不要试图捕获它们!

关于python - 如何在 Flask 中处理 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23296426/

相关文章:

python - 用于 GrabCut 算法的 OpenCV Python 绑定(bind)

python - 将 FFT 频谱幅度归一化为 0dB

python - 将 Python 对象转换为适用于 PyV8 的 JavaScript

c# - 解析数组和单个对象

python - SQLAlchemy 通过 JSON 子字段加入

python - 在python3中的csv文件的特定行之后添加一个新行

json - json-rpc 和 json-api 有什么区别?

python - Flask 表单仅返回 FALSE 的问题

python - 为从数据库检索的数据创建动态html链接

python - Flask:在 URL 中使用 URL 绑定(bind)?