在Cherrypy中逐行读取json数据

时间:2013-02-14 15:52:14

标签: python json rest curl cherrypy

我的json数据将以下列格式发送到我的服务器:

{"line":"one"}
{"line":"two"}
{"line":"three"}

虽然我意识到这不是有效的json格式,但我无法控制这些数据是如何传达给我的。我需要能够逐行读取数据

现在我有一个非常简单的Cherrypy服务器设置来接受POST请求。这是处理POST请求的函数:

class PostEvent(object):
    exposed = True
    def POST(self, **urlParams):
        cl = cherrypy.request.headers['Content-Length']
        raw_body = cherrypy.request.body.read(int(cl))
        lines = raw_body.splitlines()
        with open('log.txt', 'w') as f:
            for line in lines:
                f.write('%s\n' % line)

然后我只发出以下curl命令来测试:

curl -i -k -H "Content-Type: application/json" -H "Accept: application/json" -X POST --data @test_data -u username http://test-url.com

文件test_data包含上述指定格式的json数据。我得到200响应,但是,从文件中读取的所有数据都在一行上,如下所示:

{"line":"one"}{"line":"two"}{"line":"three"}

似乎当cherrypy正在阅读身体时,它忽略了诸如\n之类的行分隔符。如何格式化请求主体如何获取cherrypy?或者更具体地说,我如何逐行读取请求体,而不是一次读取所有请求体?

1 个答案:

答案 0 :(得分:3)

我无法想象CherryPy那样的数据。

你写出新行计数的测试表明,curl更不可能没有完整的新行发送数据,并且当你的请求处理程序拥有它时,所有换行都被剥离了(所以{ {1}}只返回raw_body.splitlines(),导致写入一行。

确保使用[raw_body]开关进行发布; --data-binary默认为ASCII,很可能正在改变换行符:

  

-d-d, --data相同。要纯数据二进制发布数据,您应该使用--data-ascii选项。