如何创建Flask端点?
从我之前的问题中你可以看到,我一直在做一个项目,现在我真的想知道怎么把最后一部分完成。
项目的简单总结:我有一个树莓派,它在运行一个网页服务器(Lighttpd)和Flask。它连接了一个RF USB发射器,通过一个Python脚本控制插座的电源。(在GitHub上的Power.py)。这个功能是可以正常工作的。
现在我需要在Flask中创建一个接口,这样Salesforce就可以发送一些JSON数据过来,而Flask能够理解这些数据。
我想尽量简单明了,这样我才能理解它到底在做什么。在我上一个问题中,有人给了我一些帮助,但我觉得还是问一个具体的问题比较好,而不是试图一次性涵盖太多内容。
我需要发送的内容就是 'power=on/off'
、'device=0,1,2'
、'time=(秒数,整数形式)'
和 'pass=密码'
。我可以把这些作为网址参数发送,或者通过POST请求发送到我上面提到的 power.py
,这样就可以实现功能。
我希望能有一个简单明了的方法,从Salesforce发送这些数据到Flask,并让Flask理解这个请求。
其实我现在只需要去访问: ip/cgi-bin/power.py?device=0&power=on&time=10&pass=password
这样就会加载一个Python脚本,把设备0打开10秒钟。(0表示无限制)。
我该如何把这个转换成JSON格式?我需要在Flask中写什么代码才能让它理解这些内容?我能把这些变量转发到 power.py
吗,这样Flask文件只需要找到变量和对应的值就可以了?
我在Chrome上下载了Postman,这样我就可以向树莓派发送POST请求来测试一些东西。
作为初学者,我在哪里可以找到更多相关的信息呢?
我可以发送类似这样的内容吗?
'requestNumber = JSONRequest.post(
"ip/api.py",
{
deviceid: 0,
pass: "password",
time: 60,
power: "on"
},'
1 个回答
我不知道你怎么让Salesforce发送一个带有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)
当Salesforce访问这个网址 http://example.com/power/ 时,你的应用程序会执行power()这个函数,并把一个包含JSON内容的字典作为参数传进去。你可以用whatever_function_you_want_to_launch这个函数来处理这个字典,执行你想要的操作,然后把结果返回给power()函数。最后,power()函数会把这个结果再返回给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"}'