如何在Flask中处理JSON?

1 投票
2 回答
757 浏览
提问于 2025-04-18 04:14

我之前问过一些关于这个问题的问题,但还是没能解决我的困扰。

我想让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 个回答

1

要获取Json格式的Post值,你需要使用request.json这个方法。

if request.json and 'email' in request.json:
    request.json['email']
1

你的 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))

在这里,我还修改了异常处理器,只处理特定的异常;尽量避免 抓取所有异常 的做法;不要试图捕捉所有的异常!

撰写回答