0

我正在为一个小型 api 项目尝试 Falcon。不幸的是,我被困在 json 解析内容上,并且文档示例中的代码不起作用。

我已经尝试了很多我在 Stack 和 Google 上找到的东西,但没有任何变化。我尝试了以下导致以下错误的代码

import json
import falcon

class JSON_Middleware(object):
    def process_request(self, req, resp):
       raw_json = json.loads(req.stream.read().decode('UTF-8'))
       """Exception: AttributeError: 'str' object has no attribute 'read'"""

       raw_json = json.loads(req.stream.read(), 'UTF-8')
       """Exception: TypeError: the JSON object must be str, not 'bytes'"""

       raw_json = json.loads(req.stream, 'UTF-8')
       """TypeError: the JSON object must be str, not 'Body'"""

我正在放弃的路上,但如果有人能告诉我为什么会发生这种情况以及如何在 Falcon 中解析 JSON,我将非常感激。

谢谢

环境:OSX Sierra Python 3.5.2 Falcon 等是 Pip 的最新版本

4

2 回答 2

2

如果有其他代码段,您的代码应该可以工作。快速测试(文件名 app.py):

import falcon
import json

class JSON_Middleware(object):
    def process_request(self, req, resp):
       raw_json = json.loads(req.stream.read())
       print raw_json

class Test:
    def on_post(self,req,resp):
        pass

app = application = falcon.API(middleware=JSON_Middleware())
t = Test()
app.add_route('/test',t)

运行:gunicorn app
$ curl -XPOST 'localhost:8000' -d '{"Hello":"wold"}'

于 2016-10-10T09:14:11.970 回答
1

您必须使用encode()类似.read()req.stream.read().encode('utf-8')

这样,字节将按预期转换为 str json.loads()

不为所有这些无聊且容易出错的编码/解码和字节/字符串(顺便说一句在 Py2 和 Py3 中不同)而烦恼的另一种方法是使用 simplejson 作为 json 的替代品。它与 API 兼容,因此唯一的更改是在您的代码中import json替换为。import simplejson as json

此外,它还简化了代码,因为可以使用 读取正文json.load(req.bounded_stream),这比json.loads(req.bounded_stream.read().encode('utf-8')).

我现在就是这样做的,不再使用标准的 json 模块了。

于 2017-07-30T15:50:37.690 回答