我之前已经问过一些关于这个问题的问题,但仍然没有解决我的问题。
我试图允许 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/