如何制作Flask Endpoint?

时间:2014-03-28 11:34:26

标签: python json api flask raspberry-pi

正如您将从我之前的问题中看到的那样,我一直致力于一个项目,并且真的想知道如何完成最后一部分。

项目快速摘要:我有一个运行Web服务器(Lighttpd)和Flask的Raspberry Pi。它连接了一个RF USB发送器,通过Python脚本控制插头的电源。 (GitHub上的Power.py)。这很有效。

我现在需要在Flask中创建一个端点,以便Salesforce可以向它发送一些JSON,它会理解它。

我想尽可能地保持这个,所以我理解它实际上在做什么。在我的上一个问题中,有人给我提供了一些东西,但我认为最好有一个与之相关的具体问题,而不是试图在一个问题上覆盖太多。

我需要能够发送的只有'power=on/off''device=0,1,2''time=(secondsasinteger)''pass=thepassword'我可以将其作为网址变量或POST发送给我现有的{上面链接了{1}},它就是这样做的。

我想要一种简单明了的方法,将它从Salesforce中以JSON格式发送给Flask,让它理解请求。

我现在需要做的就是去:power.py

这将加载Python脚本,并打开设备0 10秒钟。 (0是无限制的)。

如何将其转换为JSON?我需要将哪些代码放入Flask才能理解?我可以将变量转发到ip/cgi-bin/power.py?device=0&power=on&time=10&pass=password,这样Flask文件只需要找到变量和值吗?

我已经在Chrome中下载了Postman,这使我可以将POST发送到Pi进行测试。

作为初学者,我在哪里可以找到更多关于此的信息?

我可以寄这样的东西吗?

power.py

1 个答案:

答案 0 :(得分:2)

我不知道如何让saleforce发送带有关联JSON的POST请求,但使用Flask捕获它是相当容易的。请考虑以下示例:

from flask import request
from yourmodule import whatever_function_you_want_to_launch
from your_app import app

@app.route('/power/', methods=['POST'])
def power():
    if request.headers['Content-Type'] == 'application/json':
        return whatever_function_you_want_to_launch(request.json)
    else:
        return response("json record not found in request", 415)

当saleforce访问url http://example.com/power/时,您的应用程序会执行power()函数,将其作为参数传递给包含JSON内容的字典。 whatever_function_you_want_to_launch函数可以使用字典触发您想要执行的任何操作,并将响应返回给power()函数。 power()函数会将此respose返回给salesforce。

例如:

def whatever_function_you_want_to_launch(data):
    device = data['deviceid']
    power = data['power']
    message = ""
    if power == "on":
       turn_power_on(device)
       message = "power turned on for device " + device
    else:
       turn_power_off(device)
       message = "power turned off for device " + device
    return make_response(message, 200)

当然,这只是一个简短的例子。您需要添加一些其他内容(例如,处理JSON格式错误或不包含其中一个请求密钥的情况)。

为了测试整个内容,您还可以使用curl命令(在Linux上可用,在其他操作系统上不知道)使用这种语法:

curl -H "Content-type: application/json" -X POST http://localhost:5000/power/ -d '{"deviceid": "0", "pass": "password", "time": "60", "power": "on"}'