【问题标题】:Reading json data line by line in Cherrypy在 Cherrypy 中逐行读取 json 数据
【发布时间】:2013-02-14 15:52:14
【问题描述】:

我有 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读取格式化的请求正文?或者更具体地说,我怎样才能逐行而不是一次全部读取请求正文?

【问题讨论】:

  • raw_body.count('\n') 之类的内容写入文件时会发生什么?
  • @MartijnPieters 当我添加f.write(str(raw_body.count('\n'))) 时,我得到0。即使我明确地将\n 添加到行尾,我仍然会得到0。 cherrpy 是否可以事先进行某种预处理?
  • 这意味着 raw_body 确实 not 在其中包含换行符,因此 .splitlines() 在列表中返回 raw_body 不变,并且您将其写出文件为一条线。您是否 100% 确定 curl 正在使用 \n 换行符发送数据?
  • @MartijnPieters 就是这样。显然,如果您希望您的数据完全按照curl 的格式发送,您必须使用--data-binary 标志。如果你想回答,我会接受。非常感谢!
  • 啊,确实; --data-ascii 会弄乱换行符。在那里,制定了答案。 :-)

标签: python json rest curl cherrypy


【解决方案1】:

我无法想象 CherryPy 会这样处理数据。

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

确保您使用--data-binary 开关发布; -d 默认为 ASCII,很可能会为您更改换行符:

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

【讨论】:

  • 是的,帮助很大
猜你喜欢
  • 2019-09-22
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多