我正在尝试编写一个Flask Web应用程序(托管在Heroku上),该应用程序将接受从Xively POST到它的数据点。
下面的代码用于获取数据点,对其进行修改(向其添加2),然后将其发送回xively feed:
import os
from flask import Flask
from flask import request
import xively
app = Flask(__name__)
@app.route('/', methods=['GET','POST'])
def take_xively_post_data():
if request.method == 'POST':
if not request.json or not 'current_value' in request.json:
abort(400)
else:
key = 'f5vezDTq4VphhXyCn......'
feedid = '21094....'
lev = request.json['current_value']
#the following code just adds 2 to the POSTed value and
#sends it back to xively
lev = lev + 2
client1 = xively.Client(key)
datastream = xively.Datastream(id="DatastreamID", current_value= lev)
return client1.put('/v2/feeds/'+feedid, data={'datastreams': [datastream]}
else:
return 'Hello'
但是当Xively发布到应用程序的URL时,什么也没有发生。 (它应该将修改后的数据发送回Xively feed。)
Heroku日志指示500错误:
2014-05-29T14:00:55.844275 + 00:00 heroku [router]:at = info method = POST
路径= /主机= .... herokuapp.com request_id = ... fwd =“ ...” dyno = web.1
connect = 1ms服务= 17ms状态= 500字节= 454
我认为代码中有问题,但不知道它是什么...
我试过将client1.put(...)语句向上移动,不返回任何内容,如下所示,但是发生了相同的事情:
import os
from flask import Flask
from flask import request
import xively
app = Flask(__name__)
@app.route('/', methods=['GET','POST'])
def take_xively_post_data():
if request.method == 'POST':
if not request.json or not 'current_value' in request.json:
abort(400)
else:
key = 'f5vezDTq4VphhXyCn......'
feedid = '21094....'
lev = request.json['current_value']
lev = lev + 2
client1 = xively.Client(key)
datastream = xively.Datastream(id="DatastreamID", current_value= lev)
#moved the client1.put function up and returning nothing
client1.put('/v2/feeds/'+feedid, data={'datastreams': [datastream]}
return
else:
return 'Hello'
我尝试了request.form()而不是request.json(),但这似乎也不起作用。
如果有人可以指出编码错误,我将不胜感激。
最佳答案
不知道您是否解决了您的问题,但我想我可以帮您。
您请求当前值的方式很可能是错误的。这将导致找不到您的密钥,这肯定会通过500。
我假设您正在使用Xively触发器来发出POST请求。如果是这种情况,请先将lev = request.json['current_value']
更改为lev = request.json['triggering_datastream']['value']['value']
。这至少应该为您提供发送触发器的数据流的实际当前值。
然后,当然将您的return
值更改为200
之类的内容,没有其他人建议的内容。
看看是否可行,然后我们可以尝试调试您发送回Xively的PUT。该代码对我来说看起来很正确。
关于python - 如何在Flask Web应用程序中从Xively接受POST数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23936454/