如何在Flask中处理JSON?
我之前问过一些关于这个问题的问题,但还是没能解决我的困扰。
我想让Salesforce能够通过JSON(REST API)远程发送指令给树莓派。树莓派通过一个叫TellStick的RF发射器控制一些RF插头的电源。这个设置都已经完成,我可以用Python发送这些指令。现在我只需要让树莓派能够接受JSON格式的数据,然后再想办法从Salesforce发送指令。
有位好心人在我的GitHub项目上进行了分支,并给我提供了一些代码,应该可以让它工作。但不幸的是,它还是没有正常运行。
这是我之前的问题:如何接受JSON POST请求?
这是分支的代码库:https://github.com/bfagundez/RemotePiControl/blob/master/power.py
我需要做什么呢?我在Postman扩展和cURL中发送了测试JSON消息,但总是出现错误。
我只想发送各种变量,让脚本处理剩下的事情。
目前我可以向一个.py脚本发送一些URL变量,比如/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()
2 个回答
要获取Json格式的Post值,你需要使用request.json这个方法。
if request.json and 'email' in request.json:
request.json['email']
你的 deviceID
变量是一个 字符串,而不是整数;它里面包含一个 '1'
字符,但这还不是整数。
你可以选择明确地转换它:
device = devices[int(deviceId)]
或者告诉 Flask 你想要在路由中使用一个整数参数:
@app.route("/API/v1.0/power-on/<int:deviceId>", methods=['POST'])
def powerOnDevice(deviceId):
这里的 int:
部分是一个 URL 路由转换器。
你的视图函数应该返回一个响应对象、一个字符串或者一个元组,而不是像现在这样返回一个字典,具体可以参考 关于响应。如果你想返回 JSON 数据,可以使用 flask.json.jsonify()
函数:
# 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))
在这里,我还修改了异常处理器,只处理特定的异常;尽量避免 抓取所有异常 的做法;不要试图捕捉所有的异常!