我正在尝试编写一个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/

10-10 03:53