如何在Flask中处理JSON?

时间:2014-04-25 14:51:41

标签: python json flask salesforce raspberry-pi

我之前已经问了几个问题,但仍然没有解决我的问题。

我正在尝试允许Salesforce通过JSON(REST API)远程向Raspberry Pi发送命令。 Raspberry Pi通过名为TellStick的射频发射器控制一些射频插头的功率。这是所有设置,我可以使用Python发送这些命令。现在我需要做的就是让Pi接受JSON,然后找出如何从Salesforce发送命令。

有人在GitHub上分享了我的回购,并为我提供了一些可以使它工作的代码。但不幸的是它仍然没有用。

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

以下是分叉回购: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()

2 个答案:

答案 0 :(得分:1)

要检索Json Post值,您必须使用request.json

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

答案 1 :(得分:1)

您的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

您的视图应该返回响应对象,字符串或元组而不是字典(就像您现在一样),请参阅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;不要试图抓住它们!